循环中的相关项目会创建许多重复的查询

时间:2019-05-15 17:18:02

标签: django django-models

在模板中请求相关对象时,呈现页面的速度非常慢。

class Item(models.Model):
   name =  models.CharField(max_length=160)
   ...

class Box(models.Model):
   ...
   items = models.ForeignKey(Item, on_delete=models.CASCADE, null=True) 

#template  
{% for item in items %}  
   {{ item.box_set.first }}  
   {{ item.box_set.latest }}  
{% endfor %}

调试工具栏显示了很多重复的查询。 为什么会这样呢?有没有办法加快速度?

1 个答案:

答案 0 :(得分:1)

除非已被缓存,否则Django ORM在访问相关字段时必须向数据库发出请求。缓存相关对象的主要方法是通过select_relatedprefetch_related

您要尝试做的事情有些困难;您正在尝试从集合中获取两个特定项目。您可以使用.annotate()Subquery从相关模型中提取单个字段。如果您只想显示Box中的单个字段,这将很有用,但是如果您需要整个Box实例,则将无法使用。