zoukankan      html  css  js  c++  java
  • orm之单表操作

    表记录(增-删-改-查)

    1,增

    • 方式一:实例化对象就是一条表记录

      • save方法:翻译成SQL语句,然后调用pymysql,发送给服务端

      • Frank_obj = models.Student(name ="david",course="python",birth="2000-9-9",fenshu=80)
        Frank_obj.save()
        
    • 方式二:obj.create()创建

      •  models.Student.objects.create(name ="路明非",course="python",birth="1995-5-9",fenshu=88)
        

    2,删

    • delete()

      • models.UserInfo.objects.filter(id=7).delete()  #queryset对象调用
        models.UserInfo.objects.filter(id=7)[0].delete()  #model对象调用
        
      • 也可以一次性删除多个对象,每个Queryset都有一个delete()方法,他一次性删除所有Queryset对象

      • 要牢记这一点:无论在什么情况下,QuerySet 中的 delete() 方法都只使用一条 SQL 语句一次性删除所有对象,而并不是分别删除每个对象。如果你想使用在 model 中自定义的 delete() 方法,就要自行调用每个对象的delete 方法。(例如,遍历 QuerySet,在每个对象上调用 delete()方法),而不是使用 QuerySet 中的 delete()方法。

    • 删除所有对象

      • …all().delete()
    • 在 Django 删除对象时,会模仿 SQL 约束 ON DELETE CASCADE 的行为,换句话说,删除一个对象时也会删除与它相关联的外键对象

    3,改

    • 方式一:update

      •  models.UserInfo.objects.filter(id=2).update(
                 name='芬格尔',
                 checked = 0,
            )
        
    • 方式二:save

      • ret = models.UserInfo.objects.filter(id=2)[0]
        ret.name = '芬格尔+2'
        ret.checked = 1
        ret.save()
        

    4,查

    • all():结果为Queryset类型

    • filter 条件查询

      • 查询条件不能匹配到数据时,不会报错,返回一个空的queryset,<QuerySet []>

      • 如果没有写查询条件会获取所有数据,queryset类型的数据还能够继续调用fitler方法

      • ret = models.Book.objects.filter(条件1,条件2...)
        
    • get():只找一个

      • ret = models.Book.objects.get() #得到的是一个model对象,有且只能有一个
        
      • 查不到数据会报错 :Book matching query does not exist.

      • 超过一个就报错 :returned more than one Book -- it returned 13!

    • exclude():排除

      • obj对象排除

        • models.Book.objects.exclude(title__startswith=‘。。。’)
          
      • 寻找一类数据--Queryset

        • models.Book.objects.all().exclude(title__startswith='。。。')
          
    • order_by():排序

      • ‘+’ 或者 ‘-’号表示两种方向,一种升序,一种降序,‘+’默认不写

      • models.Book.objects.all().order_by('-price','id')  #orderby price desc,id asc;
        
    • reverse() :反转

      • 数据排序之后才能反转

      • models.Book.objects.all().order_by('id').reverse()  
        
    • count() :计数

      • 统计返回结果的数量

      • models.Book.objects.all().count() 
        
    • first():返回第一条数据,结果是model对象类型

      • ret = models.Book.objects.all().first()
        
    • last(): 返回最后一条数据,结果是model对象类型

      • ret = models.Book.objects.all().last()
        
    • exists(): 判断返回结果集是不是有数据

      • models.Book.objects.filter(id=9999).exists() #有结果就是True,没有结果就是False
        
    • values():返回的queryset,里面是字典类型数据

      • ret = models.Book.objects.filter(id=9).values('title','price') 
        <QuerySet [{'title': '龙族8', 'price': Decimal('67.00')}]>
        
      • ret = models.Book.objects.filter(id=9).values()
        <QuerySet [{'id': 9, 'title': '龙族8', 'price': Decimal('67.00'), 'publishDate': datetime.date(2019, 9, 9), 'publishHouse': '江南出版社'}]>
        
    • value_list():返回的queryset,里面是数组类型数据

      • ret = models.Book.objects.all().values_list('title','price')
        
        <QuerySet [('龙族0', Decimal('59.00')), ('龙族1', Decimal('60.00')), ('龙族2', Decimal('61.00')), ('龙族3', Decimal('62.00')), ('龙族4', Decimal('63.00')), ('龙族5', Decimal('64.00')), ('龙族6', Decimal('65.00')), ('龙族7', Decimal('66.00')), ('龙族8', Decimal('67.00')), ('龙族9', Decimal('68.00')), ('龙族10', Decimal('69.00')), ('龙族11', Decimal('70.00')), ('龙族12', Decimal('71.00')), ('龙族13', Decimal('72.00')), ('龙族14', Decimal('73.00')), ('龙族15', Decimal('74.00')), ('龙族16', Decimal('75.00')), ('龙族17', Decimal('76.00')), ('龙族18', Decimal('77.00')), ('龙族19', Decimal('78.00')), '...(remaining elements truncated)...']>
        
        
      • ret2 = Book.objects.filter(id=9).values_list('title', 'price')
        
        <QuerySet [('龙族8', Decimal('67.00'))]>
        
    • distinct() :去重

      • 配和values和values_list来使用

      • models.Book.objects.all().values('publish').distinct()
        

    5,双下方法查询

    • Book.objects.filter(price__in=[100,200,300]) 
      #price值等于这三个里面的任意一个的对象
      
      Book.objects.filter(price__gt=100)  
      大于等于
      
      Book.objects.filter(price__lt=100)
      小于等于
      
      Book.objects.filter(price__range=[100,200]) 
      #sql的between and,大于等于100,小于等于200
      
      Book.objects.filter(title__contains="python")  
      #title值中包含python的
      
      Book.objects.filter(title__icontains="python") 
      #不区分大小写
      
      Book.objects.filter(title__startswith="py") 
      #以什么开头,istartswith  不区分大小写
      
      Book.objects.filter(pub_date__year=2012)
      
    • 某年某月某日:
      	ret = models.Book.objects.filter(publish_date__year='2018') 
      	ret = models.Book.objects.filter(publish_date__year__gt='2018')#2018写数字也可以
          ret = models.Book.objects.filter(publish_date__year='2019',publish_date__month='8',publish_date__day='1')
      
    • 找字段数据为空的双下滑线
      	models.Book.objects.filter(publish_date__isnull=True) #这个字段值为空的那些数据
      

    在Django项目中测试orm的增删改查:test.py

        '''
        import os
        if __name__ == "__main__":
            os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoORM.settings")
            import django
            django.setup()
        # 注意!注意!注意!重要的事情说三遍,这里每段话位置都不能变。
        # 在django.setup()这里就可以写Django的代码了
        '''
    希望你眼眸有星辰,心中有山海,从此以梦为马,不负韶华
  • 相关阅读:
    springcloud12-spring cloud stream
    Linux上安装gitbook并拉取git项目编译
    Python 之一条命令生成项目依赖包文件 requirements.txt
    python跨模块使用全局变量的实现方法
    微信朋友圈测试用例
    linux安装maven
    jenkins上集成sonar
    windows上安装sonar并使用其分析项目
    jquery 点击同级元素隐藏,再点击显示
    10进制转16进制自动补全8位 并高低位转换
  • 原文地址:https://www.cnblogs.com/daviddd/p/12049991.html
Copyright © 2011-2022 走看看