我想计算查询集中返回的项目数。例如
userdesigns = Design.objects.filter (desadder = user.id)
我想使用count()获取返回没有的对象数。
原因是我正在尝试加速性能并减少我执行的数据库查询的数量,并且我注意到使用count()ping数据库,这是我不想要的。考虑到我已经提取了用户设计的完整提示,是否应该只计算存储在该返回的查询集中的项目数?
答案 0 :(得分:18)
LEN()的。在您上面调用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>
>>>
答案 1 :(得分:0)
Riateche回答了这个问题,但是如果你不想直接在QuerySet上使用len()或.count(),你可以返回一个values_list并在其上使用len()。
Django文档说:
https://docs.djangoproject.com/en/dev/ref/models/querysets/
当您知道自己只需要时,ValuesQuerySet非常有用 来自少数可用字段的值,您将不需要 模型实例对象的功能。
我怀疑这是否更快,但你可以随时计时看到。如果您只想返回表中总可用字段的子集,这可能很有用。