13

我想计算我的查询集中返回的项目数。例如

userdesigns = Design.objects.filter (desadder = user.id)

我想在使用 count() 的情况下获取返回的对象数。

原因是我试图提高性能并减少我执行的数据库查询的数量,我注意到使用 count() 会 ping 数据库,这是我不想要的。考虑到我已经提取了完整的用户设计,不应该有一种方法来计算存储在返回的查询集中的项目数量吗?

4

2 回答 2

26

伦()。当您在其上调用 len() 时,将评估 QuerySet。如您所料,这将返回结果列表的长度。

注意:如果您只想确定集合中的记录数,请不要在 QuerySets 上使用 len()。使用 SQL 的 SELECT COUNT(*) 在数据库级别处理计数要高效得多,而 Django 正是出于这个原因提供了一个 count() 方法。请参阅下面的 count()。

来源

因此,如果您调用len(userdesigns)而不是userdesigns.count(),django 将在单个查询中从表中请求所有相关数据。之后您可以访问所有userdesigns变量项,不会进行其他查询。

>>> m = Model1.objects.filter(desadder=1)
>>> len(m)
(0.000) SELECT "app1_model1"."id", "app1_model1"."desadder", "app1_model1"."test" FROM "app1_model1" WHERE "app1_model1"."desadder" = 1 ; args=(1,)
2
>>> m[0]
<Model1: Model1 object>
>>> m = Model1.objects.filter(desadder=1)
>>> len(m)
(0.000) SELECT "app1_model1"."id", "app1_model1"."desadder", "app1_model1"."test" FROM "app1_model1" WHERE "app1_model1"."desadder" = 1 ; args=(1,)
2
>>> m[0]
<Model1: Model1 object>
>>> 
于 2012-07-07T19:24:28.440 回答
0

Riateche 回答了这个问题,但如果您不想直接在 QuerySet 上使用 len() 或 .count(),则可以返回 values_list 并在其上使用 len()。

Django 文档说:

https://docs.djangoproject.com/en/dev/ref/models/querysets/

当您知道只需要来自少数可用字段的值并且不需要模型实例对象的功能时,ValuesQuerySet 很有用。

我怀疑这是否更快,但是您总是可以计时并查看。如果您只想返回表中可用字段总数的子集,它可能会很有用。

于 2012-07-08T06:21:28.080 回答