QuerySet API
我们通常做查询操作的时候都是通过"模型名字.objects"的方式进行操作的。其实"模型名字.objects"是一个"django.db.models.manager.Manager"对象,而Manager这个类是一个"空壳"的类,它本身是没有任何的属性和方法的。它的方法全部都是通过Python以动态添加的方式,从QuerySet类中拷贝过来的(至于是如何拷贝的后面简单的介绍下,知道就好)
注:本章的所有例子,大都基于这个模型类
例1:
⑴打印"模型名字.objects"
⑵查看"Manager"类
①通过步骤1的输出可以看到"模型名字.objects"返回的是一个"Manager"对象,因此查看"Manager"类
②导入"Manager"类:from django.db.models.manager import Manager
③选中"Manager"后Ctrl+B:查看源码
⑶查看"from_queryset"方法
注:
上面的源码什么的我是看得不是很懂的,只是想说明下:"objects"对象下面的方法都是从"QuerySet"对象下拷贝过来的,"QuerySet"对象对象下的方法,可以直接在"objects"对象下调用
返回新的QuerySet的方法
1、在使用QuerySet进行查找操作的时候,可以提供多种操作。比如过滤完后还要根据某个字段进行排序,那么这一系列的操作我们可以通过一个非常流畅的"链式调用"的方式进行。比如要从文章中获取标题为123,并且提取后要将结果根据发布时间进行排序,那么就可以通过下面的方式来完成:"article=Article.objects.filter(title='123').order_by('create_time')"
2、可以看到order_by方法是直接在filter()方法执行后调用的。这说明filter()方法返回的是一个拥有order_by方法的对象。而这个对象正是一个新的QuerySet对象,因此可以使用order_by方法(当然QuerySet对象还可以使用其他方法,这里只是以filter方法和order_by方法举例)
3、只要返回的数据是一个QuerySet对象,那么就可以调用QuerySet对象方法(链式调用或分步调用)。特别注意object对象中的方法是复制QuerySet对象下的方法的,因此object对象也可以直接调用QuerySet对象方法
4、本章介绍的都是QuerySet对象方法,因此这些方法都是可以组合使用的(除了有些QuerySet对象方法返回的不是QuerySet对象)
例1_1:
info = User.objects.filter(create_time__gt="2020-10-14 21:58:48").filter(telephone=13355509333)
print(info)
#<QuerySet [<User: User object (8)>]>
user = info = User.objects.filter(create_time__gt="2020-10-14 21:58:48")
print(type(user))
print(user.filter(telephone=13355509333))
# <class 'django.db.models.query.QuerySet'>
# <QuerySet [<User: User object (8)>]>
注:
1、上面例子中分别使用了两种写法来实现同一个查询
2、filter()本来就是QuerySet对象下面的方法:其返回的是一个QuerySet对象,因此这个QuerySet对象又可以继续使用QuerySet对象下面的方法(也就是这两章将要介绍的方法)
这里只是以两个filter()方法为例
3、一般采用的都是第一种写法,也就是"链式调用"
QuerySet对象方法
filter()
1、作用:将满足条件的数据提取出来,返回一个新的QuerySet对象
2、不论查询结果中有多少条数据都可以正常返回,无数据时也会返回一个空的QuerySet对象
例2:
⑴查看数据
⑵编辑视图:首次调用