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

时间:2012-02-07 12:39:29

标签: django django-models django-queryset

我在trunk中尝试过django 1.4中的prefetch_related(),无法进行预取反向查找。

我的简化模型(每本书都有很多价格):

class Book(models.Model):
    # some fields

class Price(models.Model):
    book = models.ForeignKey(Book)

我的观点查询:

books = Book.objects.prefetch_related('price')

然后,我收到了AttributeError消息:

AttributeError: Cannot find 'price' on Book object, 'price' is an invalid parameter to prefetch_related()

如何让它发挥作用? 感谢。

2 个答案:

答案 0 :(得分:79)

定义相关名称:

class Price(models.Model):
    book = models.ForeignKey(Book, related_name='prices')

然后使用它:

books = Book.objects.prefetch_related('prices')

答案 1 :(得分:10)

如果没有为关系定义_set,则反向关系会附加some_book.price_set.all()。从对象访问反向关系时就是这种情况(例如prefetch_related),但这也适用于books = Book.objects.prefetch_related('price_set')

_set

请注意,这似乎与过滤器不同,过滤器 接受没有Books.objects.filter(price__currency='EUR')的其他模型的名称(例如related_name)。

以上是用1.11.8测试的(不是这个特定代码,而是我自己的类似代码)。

或者,您可以添加change,如上面的JanPöschko所示。