django-taggit:有没有办法减少数据库查询?

时间:2011-07-01 11:19:40

标签: django django-taggit

说我有一个模特:

class Entry(models.Model):
    ...
    tags = TaggableManager()

当我在模板中迭代Entry.objects.all()时,entry.tags.all会再向数据库生成一个查询。是否可以减少查询数量?使用像select_related()之类的东西(我知道它不会起作用,因为django-taggit使用了很多关系,但我确信应该有一种方法可以在1次命中中选择所有带有相关标签的条目)?

2 个答案:

答案 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设计用于通过单个查询获取全部多人关系。