zoukankan      html  css  js  c++  java
  • ORM的操作

    ORM操作

    一般操作

          必会部分:

      1.all()  查询所有结果,最终的结果为QuerySet对象.

    models.Press.objects.all()  # 查询所有出版社
    

      2.values(*field)  返回一个ValueQuerySet —— 一个特殊的QuerySet,运行后得到的并不是一些列的model的实例化对象。而是一个可迭代的字典序列。简单点说就是ValueQuerySet列表中包含着查询到的结果,每一个结果为一个字典,字典中键为field字段,值为查到的结果。当field不写时,查询到所有的字段。

    models.Press.objects.all().values()  # 查询所有对形象的所有字段,每条记录为一个字典
    
    models.Press.objects.all().values('id', 'name')  # 查询所有对象的id和name字段,每条记录为一个字典
    

      3.values_list(*field)  与values()非常相似,区别就是他返回的是一个元祖序列.

    models.Press.objects.all().values_list()  # 查询所有对形象的所有字段,每条记录为一个元祖,顺序为values_list()中填写的字段的顺序
    
    models.Press.objects.all().values_list('id', 'name')  # 查询所有对象的id和name字段,每条记录为一个元祖,顺序为values_list()中填写的字段的顺序
    

    4.添加数据

    A:添加一条数据:
    models.UserInfo.objects.create(name='lxx',age=23, ut_id=2)
    B:创建一个字典添加数据:
      dict = {"name":'xxx', 'age':23, 'ut_id':3}
    models.UserInfo.objects.create(**dict)
     
    添加多条数据:
      info = [
            models.UserInfo(name='root1', age=34, ut_id=1),
            models.UserInfo(name='root2', age=35, ut_id=2),
            models.UserInfo(name='root3', age=36, ut_id=1),
            models.UserInfo(name='root4', age=37, ut_id=3),
            models.UserInfo(name='root5', age=32, ut_id=1),
        ]
      
     models.UserInfo.objects.bulk_create(info)
    
    

    5.删除数据

    models.Userinfo.objects.filter(id=3).delete()
    

    6.更新数据

    models.UserInfo.objects.filter(id=3).update(name='lll', age=23)
    

    7.正向查询

    查询所有用户的用户类型
        res = models.UserInfo.objects.all()
        for obj in res:
            print(obj.name, obj.age, obj.ut.title)
    

    8.反向查询

    res = models.UserType.objects.all()
        for obj in res:
            #### 表名小写_set
            # print(obj.title, obj.userinfo_set.all())
            #### releate_name的方式
            print(obj.title, obj.users.all())
    

    ORM查询用法大全

    1.字段名过滤

    1.__gt. greater than  大于
    ret = models.Person.objects.filter(id__gt=1)  # 查询id大于1的所有对象
    2.__gte. greater than equal  大于等于
    ret = models.Person.objects.filter(id__gte=1)  # 查询id大于等于1的所有对象
    3.__lt .less than  小于
    ret = models.Person.objects.filter(id__lt=4)  # 查询id小于4的所有对象
    4.__lte.less than equal  小于等于
    ret = models.Person.objects.filter(id__lte=1)  # 查询id小于等于1的所有对象
    

    2.字段名__in------(in)

    ret = models.Person.objects.filter(id__in=[1, 3])  # 查询id在列表里的所有对象
    

      3.exclude(**kwargs)------(not in)  它包含了与所给筛选条件不匹配的所有对象,最终结果为QuerySet对象.

    models.Press.objects.exclude(id=1)  # 查询id不等于1的所有出版社
    

      4.get(**kwargs)  返回与所给筛选条件相匹配的对象,返回结果只有一个,如果符合筛选条件的对象超过一个或者一个也没有,就会报错.最终结果为一个对象.

    models.Press.objects.get(id=1)  # 查询id等于1的出版社
    

      5.字段名__range=[条件1, 条件2]等价于 字段名gte=条件1,字段名lte=条件2,其中逗号(,)表示and关系.[条件1, 条件2]为闭区间.--------(between...and)

    ret = models.Person.objects.filter(id__gte=1, id__lte=3)  # 查询id大于等于1,小于等于3的所有对象
    
    ret = models.Person.objects.filter(id__range=[1, 3])  # 查询id在1到3之间的所有对象
    

    6.__startwith--__endswith--__contain-------(like)**

    ##### where name like 'like%'
        ##### g:全局 global  i: ignore (忽略大小写)
        res = models.UserInfo.objects.filter(name__startswith="ze")
        res = models.UserInfo.objects.filter(name__istartswith="zekai")
    
        ##### where name like '%kk'
        res = models.UserInfo.objects.filter(name__endswith="kkk")
        res = models.UserInfo.objects.filter(name__iendswith="jjj")
        ##### where name like '%hhh%'
        res = models.UserInfo.objects.filter(name__contains='hhh')
        res = models.UserInfo.objects.filter(name__icontains='ggg')
    
        ###正则
        res = models.UserInfo.objects.filter(name__regex="^zekai$")
    
    

    7.count返回数据库中匹配查询(QuerySet)的对象数量.

    		#### select count(*) from userinfo where id>3;
        #### select count(id) from userinfo where id>3;
        res = models.UserInfo.objects.filter(id__gt=3).count()
    

      8.order_by(*field)  对查询结果进行排序.最终的查询结果为QuerySet对象.当给*field前边加负号(-)时,按降序排序.

        from django.db.models import Count, Min, Max, Sum
    
    1 models.Press.objects.all().order_by('-id')  # 查询结果按照id降序排列.结果为QuerySet对象.
    2 models.Press.objects.all().order_by('age','-id')  # 查询结果先按照age字段增序排列,出现相同age时再按照id降序排列.结果为QuerySet对象.
    
    

    9.group by

    
    		### select id, sum(age) as s, username from userinfo group by username
        from django.db.models import Count, Min, Max, Sum
        res = models.UserInfo.objects.values("name").annotate(s=Sum('age'))
        print(res.query)
    
        ### select id, sum(age) as s, username from userinfo group by username having s > 50;
        res = models.UserInfo.objects.values("name").annotate(s=Sum('age')).filter(s__gt=50)
    

    10.limit

     ##### limit 0, 10 分页
        res = models.UserInfo.objects.all()[1:4]
        # print(res)
    
    

     

    ​  11.first()  返回第一条记录(对象),必须是返回结果为QuerySet时才能使用first()

    models.Person.objects.all().first()
    

      12.last()  返回最有一条记录(对象),必须是返回结果为QuerySet时才能使用last()

    models.Person.objects.all().last()
    

    13.only

    res = models.UserInfo.objects.only('name')
    

    14.defer --排除这个之外的信息

    res = models.UserInfo.objects.defer('id')
    

    15.Q-----(or)或者

    from django.db.models import Q
        res = models.UserInfo.objects.filter( Q(Q(id__gt=3) | Q(name='zekai')) & Q(age=23) )
    
    

    16.F----循环增加

     from django.db.models import F
        models.UserInfo.objects.update(name=F('name')+1)
    

    17.原生的sql 类似于pymysql

    from django.db import connection, connections
        cursor = connection.cursor()  # cursor = connections['default'].cursor()
        cursor.execute("""SELECT * from auth_user where id = %s""", [1])
        row = cursor.fetchone()
        print(row)
    
    

      18.distinct()  从返回结果中剔除重复记录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果.此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重.),返回结果为QuerySet对象.

     models.UserInfo.objects.values("name", 'age').distinct('name')
    
        print(res.query)  ### 查看上述代码生成的sql语句
    

      19.exists()  如果QuerySet包含数据,就返回True,否则返回False.

    models.Person.objects.all().exists()
    

      20.reverse()  对查询结果进行反序排序,请注意reverse()通常只能在具有已定义排序的QuerySet上调用(在model类的Meta中指定order_by()或者调用ordering方法.)

    models.Person.objects.all().reverse()
    

  • 相关阅读:
    C/S模式客户端连接服务器连接不上的问题
    C#获取网络状态
    SQL2008R转SQL2005
    Centos7 调整磁盘空间
    crontab 定时任务
    nginx 简单教程
    vagrant 使用
    加快 hive 查询的 5 种方法
    编译 ambari 2.7.3
    kylin 连接 hortonworks 中的 hive 遇到的问题
  • 原文地址:https://www.cnblogs.com/zhuyuanying123--/p/11354258.html
Copyright © 2011-2022 走看看