如何计算queryset中没有count()的项数

时间:2012-07-07 19:05:44

标签: python django

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

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

我想使用count()获取返回没有的对象数。

原因是我正在尝试加速性能并减少我执行的数据库查询的数量,并且我注意到使用count()ping数据库,这是我不想要的。考虑到我已经提取了用户设计的完整提示,是否应该只计算存储在该返回的查询集中的项目数?

2 个答案:

答案 0 :(得分:18)

  

LEN()的。在您上面调用len()时会评估QuerySet。正如您所料,这会返回结果列表的长度。

     

注意:如果您只想确定集合中的记录数,请不要在QuerySets上使用len()。效率更高   使用SQL的SELECT COUNT(*)处理数据库级别的计数,   和Django恰恰提供了一个count()方法。看到   count()如下。

Source

因此,如果您拨打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>
>>> 

答案 1 :(得分:0)

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

Django文档说:

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

  

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

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