django - 使用列表推导式或 django 的 'values_list' 函数,哪种方法更有效?

标签 django python-3.x performance

当尝试从 django 对象返回值列表时,使用列表理解的性能会更好:

[x.value for x in Model.objects.all()]

或在 django 的 values_list 函数上调用 list():
list(Model.objects.values_list('value', flat=True))

为什么?

最佳答案

最有效的方法是采用第二种方法(使用 values_list() )。这样做的原因是,这会修改发送到数据库的 SQL 查询以仅选择提供的值。

第一种方法首先从数据库中选择所有值,然后再次过滤它们。因此,您已经“花费”了资源来使用该方法获取所有值。

您可以比较通过使用 str(queryset.query) 包装 QuerySet 生成的查询,它将返回执行的实际 SQL 查询。

请参阅下面的示例

class Model(models.Model):
    foo = models.CharField()
    bar = models.CharField()

str(Model.objects.all().query)  
# SELECT "model"."id", "model"."foo", "model"."bar" FROM "model"

str(Model.objects.values_list("foo").query)
# SELECT "model"."foo" FROM "model"

关于django - 使用列表推导式或 django 的 'values_list' 函数,哪种方法更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55636405/

相关文章:

python - Django 2.13 : NoReverseMatch at/basic_app/user_login/

python - Windows:如何配置多个版本的Python以协同工作?

python - 尝试构建逻辑解析器时出错

performance - 在 * 元素上使用背面可见性

mysql - 提高 MySQL 中 JOIN 的速度

django - 在 django-crispy 按钮名称中使用 django 模板变量

mysql - Django ORM和mysql限制查询的区别

django - 如何使用 Docker 将图形工具附加到 Django

python - getattr 和 unicode 属性

performance - 第一次查询 WMI 性能计数器时出现奇怪的延迟