数据库接口 QuerySet API
定义:
从数据库查询出来的结果一般是个集合,这个集合就是QuerySet
优点:
1、可切片:用来限制查询集记录的数目 。相当于SQL 的LIMIT 和OFFSET 子句。
2、可迭代:常用于for循环
3、惰性查询:创建查询集不会带来任何数据库的访问。你可以将过滤器保持一整天,直到查询集需要求值时,Django 才会真正运行这个查询。
4、缓存机制:在一个新创建的查询集中,缓存为空。首次对查询集进行求值 —— 同时发生数据库查询 ——Django 将保存查询的结果到查询集的缓存中并返回明确请求的结果(例如,如果正在迭代查询集,则返回下一个结果)。接下来对该查询集的求值将重用缓存的结果。
下面是 QuerySet 的常用方法,返回一个新的 QuerySet:
- all
查询所有 - get
用来获取某一个对象,满足条件的出现多条数据就会报错
- filter
查询满足条件的一些人,例如下图查询的name必须是jj,相当于Person.objects.filter(name__exact=“jj”)
iexact:不区分大小写
contains:包含
__regex:正则表达式查询
- exclude:排除符合某条件的,找出名称含有jj, 但是排除年龄是18岁的
- delete
- values_list
获取元组形式结果
- values
获取字典形式的结果
注意:
1. values_list 和 values 返回的并不是真正的列表或字典,也是 queryset,他们也是 lazy evaluation 的(惰性评估,通俗地说,就是用的时候才真正的去数据库查)
2. 如果查询后没有使用,在数据库更新后再使用,你发现得到在是新内容!!!如果想要旧内容保持着,数据库更新后不要变,可以 list 一下
3. 如果只是遍历这些结果,没有必要 list 它们转成列表(浪费内存,数据量大的时候要更谨慎!!!) - annotate
– 聚合:sql中类似于group by
– 求和:待讨论
– 取平均值:待讨论
例:获取作者的名称及作者的文章数
参考:https://code.ziqiangxuetang.com/django/django-queryset-advance.html