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

use*_*021 11 python django

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

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

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

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

Pav*_*hov 19

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>
>>> 
Run Code Online (Sandbox Code Playgroud)