ORM的操作

Posted zhuyuanying123--

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()

以上是关于ORM的操作的主要内容,如果未能解决你的问题,请参考以下文章

Django之ORM操作

Django - ORM操作

Django ORM 操作

orm操作

Django的orm操作数据库

django之ORM数据库操作