QuerySet有很多API接口,比如常用的Iterable、exists()、len()、count()、切片、pickling、cache、repr()、list().
iterable:
QuerySet是可迭代的,它在首次迭代查询集时执行实际的数据库查询。例如下面的语句会将数据库中所有Entry 的headline 打印出来:
for obj in Entry.objects.all(): print(obj.name)
exists()方法更高效。
exists()
False。
QuerySet 中的最高效的方法是:
entry = Entry.objects.get(pk=123)
if some_queryset.filter(pk=entry.pk).exists():
print("Entry contained in queryset")
若要查找一个QuerySet 是否包含任何元素:
if some_queryset.exists():
print("There is at least one object in some_queryset")
将快于:
if some_queryset:
print("There is at least one object in some_queryset")
filter
- QuerySet,包含与给定的查询参数匹配的对象。
exclude
QuerySet,它包含不满足给定的查找参数的对象。
annotate
查询集中的对象一个聚合函数(平均值、和等)。annotate() 的每个参数都是一个annotation,它将添加到返回的QuerySet的每个对象中。
order_by
QuerySet 指定特定的排序。
Entry.objects.filter(pub_date__year=2005).order_by('-pub_date', 'headline')
,像这样:
Entry.objects.order_by('?')
通过关联字段排序QuerySet 还能够不用带来JOIN 产生的花费,方法是引用关联字段的_id:
# No Join
Entry.objects.order_by('blog_id')
# Join
Entry.objects.order_by('blog__id')
你还可以通过调用表达式的asc() 或者desc()
reverse()
reverse() 将恢复到原有的排序。
reverse() 之前没有定义排序,那么调用之后仍保持没有定义)。
distinct()
它将去除查询结果中重复的行。
Select_related(*fields)
它会生成一个复杂的查询并引起性能的损耗,但是在以后使用外键关系时将不需要数据库查询。
defer(*fields)
如果您在某些情况下使用查询集的结果,当您最初获取数据时不知道是否需要这些特定字段,可以告诉Django不要从数据库中检索它们。
这是通过传递字段名称不加载到defer():
Entry.objects.defer("headline", "body")
only(*fields)
only()指定补充的字段集可以导致更简单的代码。
以下两个查询集是相同的,就延迟字段而言:
>>>Person.objects.defer("age", "biography") >>>Person.objects.only("name")
select_for_update(nowait=False)
语句
>>>entries = Entry.objects.select_for_update().filter(author=request.user)
所有匹配的行将被锁定,直到事务结束。这意味着可以通过锁防止数据被其它事务修改。
这将使查询不阻塞。
显然,用户应该检查后端的支持情况。
这是防止意外造成代码被阻塞。
count()
永远不会引发异常。
iterator()
- QuerySet,这可以带来更好的性能和显着减少内存。
latest(field)
使用作为日期字段提供的field_name,按日期返回表中的最新对象。 此示例根据pub_date字段返回表中的最新条目:
Entry.objects.latest('pub_date')
first()
- QuerySet 没有设置排序,则将会自动按主键进行排序
>>>p = Article.objects.order_by('title', 'pub_date').first()
等于:
try: p = Article.objects.order_by('title', 'pub_date')[0] except IndexError: p = None
last()
- first(),只是返回的是查询集中最后一个对象。
未完待续