2012-07-07 108 views
7

我想计算在我的查询集中返回的项目数。例如如何统计queryset中的项目数量(不计数)()

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

我想获得使用计数对象的数量返回没有()。

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

回答

16

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> 
>>> 
+0

哦有趣。所以你在说,不是在上面运行我的查询,而是我可以从开始就使用'len()'并且'userdesigns'中的所有项都会出现在这里。 – user1328021 2012-07-07 19:36:49

+0

是的。我从django shell中添加了一个例子。 – 2012-07-07 19:43:33

+1

“原因是我试图加快性能并减少我执行的数据库查询的数量”=>然后学习使用'Queryset.select_related'。 – 2012-07-08 09:09:08

0

Riateche回答了这个,但如果你不想直接在查询集使用LEN()或.Count中(),您可以返回values_list和使用LEN()就可以了。

Django文档说:当你知道你只打算从少数可用字段需要 值

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

一个ValuesQuerySet是有用的,你将不再需要 模型实例对象的功能。

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