django prefetch_related 很多查询

Posted

技术标签:

【中文标题】django prefetch_related 很多查询【英文标题】:django prefetch_related many queries 【发布时间】:2015-02-15 04:17:02 【问题描述】:

Django 1.7

我有一个模型:

   class Model(models.Model):
       tags = models.ManyToManyField(..)

当我执行Model.objects.prefetch_related().... 时,会发出许多单独的查询来获取标签,每个模型一个。

我预计会发生 2 个查询:1 个用于获取模型,另一个用于获取所有模型的标签。

怎么做?

已编辑

我正在使用像 Model.objects.prefetch_related('tags').raw_query(..) 这样的原始查询

【问题讨论】:

【参考方案1】:

你应该指定一个字段名来预取:

Model.objects.prefetch_related('tags')

如果您使用queryset.raw() 方法,则prefetch_related() 逻辑不起作用。

【讨论】:

嗯,你用的是哪个版本的django?在 django 1.7.4 中,您的代码会引发异常:AttributeError: 'QuerySet' object has no attribute 'raw_query' 你可以使用raw()(不是raw_query())吗?如果这种情况prefetch_related() 将不起作用。显示完整代码,可能是其他解决方案,而不是raw() 调用。

以上是关于django prefetch_related 很多查询的主要内容,如果未能解决你的问题,请参考以下文章

详解Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化

Django:prefetch_related() 是不是遵循反向关系查找?

Django:prefetch_related 没有效果

prefetch_related 上的 Django ORM 注释

django prefetch_related 很多查询

Django - 过滤 prefetch_related 查询集