如何在没有count()的情况下计算queryset中的项数

2024-05-14 04:10:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想计算我的queryset中返回的项目数。例如

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

我想用count()得到返回的对象数,而不使用

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


Tags: 对象id数据库数量objectscount原因filter
2条回答

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

Django文件说:

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

A ValuesQuerySet is useful when you know you're only going to need values from a small number of the available fields and you won't need the functionality of a model instance object.

我怀疑这是再快,但你可以随时看到它的时间。如果您只想返回表中可用字段总数的子集,那么它可能很有用。

len(). A QuerySet is evaluated when you call len() on it. This, as you might expect, returns the length of the result list.

Note: Don't use len() on QuerySets if all you want to do is determine the number of records in the set. It's much more efficient to handle a count at the database level, using SQL's SELECT COUNT(*), and Django provides a count() method for precisely this reason. See count() below.

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

相关问题 更多 >