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(),只是返回的是查询集中最后一个对象。

 

未完待续  

 

  

相关文章:

  • 2021-12-27
  • 2021-07-14
  • 2021-10-15
  • 2021-06-14
  • 2021-08-14
  • 2021-11-06
  • 2022-02-02
  • 2022-02-08
猜你喜欢
  • 2022-12-23
  • 2021-05-19
  • 2021-11-11
  • 2022-02-07
  • 2022-03-07
  • 2021-08-06
相关资源
相似解决方案