说我有一个模特:
class Entry(models.Model):
...
tags = TaggableManager()
当我在模板中迭代Entry.objects.all()时,entry.tags.all会再向数据库生成一个查询。是否可以减少查询数量?使用像select_related()之类的东西(我知道它不会起作用,因为django-taggit使用了很多关系,但我确信应该有一种方法可以在1次命中中选择所有带有相关标签的条目)?
答案 0 :(得分:2)
从Django 1.4开始,您可以使用prefetch_related
在单个查询中检索查询集上的一对多关系。不幸的是,这与django-taggit不起作用,因为'tags'属性是一个管理器而不是一个真正的关系,所以prefetch_related无法理解它。相反,您需要遵循tagged_items关系:
entries = Entry.objects.prefetch_related('tagged_items__tag')
然后,您需要在模板代码中进行一些类似的扭曲才能访问预取标记,因为entry.tags.all
将运行另一个查询而不是使用预取:
{% for tagged_item in entry.tagged_items %}
<li>{{ tagged_item.tag.name }}</li>
{% endfor %}
答案 1 :(得分:0)
尝试使用Select Reverse设计用于通过单个查询获取全部多人关系。