Django:.count()是否强制执行查询集评估

时间:2020-07-15 03:55:30

标签: django django-queryset django-orm django-database

我想传递一个查询集,该查询集涉及将行计数到一个函数而无需立即调用数据库。例如,以下查询集是惰性的,并且直到对其求值后才访问数据库:

queryset = MyModel.objects.all()

我从Django docs知道len()会强制进行评估,但是count()呢?这会立即击中数据库吗?

queryset = MyModel.objects.all().count()

编辑:我澄清了我的问题

1 个答案:

答案 0 :(得分:0)

我希望这能回答您的查询。

count()调用会在幕后执行SELECT COUNT(*),因此您 应该始终使用count()而不是将所有记录加载到 Python对象并在结果上调用len()(除非您需要 无论如何将对象加载到内存中,在这种情况下,len()将是 更快)。

请注意,如果要获得QuerySet中的项目数,还需要 从中检索模型实例(例如,通过遍历 它),使用len(queryset)可能会更有效,而使用count() 导致像const firstName= await page.$('[name=firstName]') expect(firstName!=null).equal(true) 这样的额外数据库查询。

https://docs.djangoproject.com/en/3.0/ref/models/querysets/#count