Django中的QuerySet
在Django的Model中,QuerySet是一个很重要的概念。对数据库的所有查询以及更新交互都是通过QuerySet来完成的。Django从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet。
QuerySet定义:
class QuerySet(model=None, query=None, using=None)[source]
QuerySet类具有两个公有属性用于内省:
ordered:如果QuerySet是排好序的则为True,否则为False。
db:如果现在执行,则返回使用的数据库。
Django中的QuerySet本质上是一个懒加载的对象,在内部,创建、过滤、切片和传递一个QuerySet不会真实操作数据库,在对查询集提交之前,不会发生任何实际的数据库操作。
userinfo = UserInfo.objects.all() # 返回一个QuerySet对象并赋值给userinfo
userinfo_id = userinfo.filter(id=1) # 继续返回一个QuerySet对象并赋值给userinfo_id
print(userinfo_id) # 此时会根据上边的两个条件执行数据查询操作,对应的SQL语句为:SELECT * FROM tablename where id =1;
QuerySet部分支持链式调用
支持链式调用的接口:
- all接口: 用于查询所有数据
- filter接口: 根据条件进行过滤
- exclude接口: 同filter,只是相反的逻辑
- reverse接口: 把Queryset中的结果倒序排列
- distinct接口: 用来进行去重查询
- none接口: 返回空的Queryset
不支持链式调用的接口:
- get接口:用于查询,存在返回对应的实例,不存在,则抛出DoesNotExist异常
- create接口:直接创建一个Model对象
- get_or_create接口:根据条件查找,如果没有查找到,就调用create创建
- update_or_create接口:同get_or_create,只是用来做更新操作
- count接口:用于返回Queryset有多少条记录
- latest接口:用于返回最新一条记录,但需要在Model的Meta中定义:get_latest_by = <用来排序的字段>
- earliest接口:同上,返回最早的一条记录
- first接口:从当前Queryset记录中获取第一条
- last接口:同上,获取最后一条
- exists接口:返回True或者False,只需要判断Queryset是否有数据用这个接口最合适
- bulk_create接口:同create,用来批量创建记录
- in_bulk接口:批量查询
- update接口: 用来根据条件批量更新记录
- delete接口: 同update,这个接口是用来根据条件批量删除记录。update和delete都会出发Django的signal
- values接口:当我们明确知道只需要返回某个字段的值,不需要Model实例时,可以使用
- values_list接口:同values,但直接返回的是包含tuple的Queryset
执行一个对象中的方法之后得到的结果还是这个对象,这样可以接着执行对象上面的其他方法,这就是链式调用。
data = UserInfo.objects.filter(id=1).filter(class_id=2).filter(name="xxx")