缓存或预取Django的反向关系

时间:2012-10-23 15:16:07

标签: python django prefetch

考虑带有Publishers表和Books表的shema,以便

def Publisher(models.Model):
  city = models.CharField()
  ...

def Book(models.Model):
  title = models.CharField()
  publisher = models.ForeignKey(Publisher)

在我的模板中,我希望显示某些发布商及其所有图书的列表。在我的视图功能中,我使用类似

的内容来获取所需的发布者
publishers=Publisher.objects.filter(city='NY')

然后在我看来,我遍历发布商和publishers.book_set.all,如

{% for p in publishers %}
....
   {% for b in p.book_set.all %}

这可以按预期工作,但它显然会像数十亿次一样击中数据库。

如何优化代码,以便django只能击中db一次或两次?

1 个答案:

答案 0 :(得分:7)

在Django 1.4+中,使用prefetch_related

Publisher.objects.filter(city='NY').prefetch_related('book_set')

在Django< 1.4中,使用django-batch-select