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

Django:prefetch_related()是否遵循反向关系查找?,django,django-models,django-queryset,Django,Django Models,Django Queryset,我在django 1.4中尝试了从trunk预取_related(),但无法预取反向查找 我的简化模型(每本书都有很多价格): 我的观点的疑问: books = Book.objects.prefetch_related('price') 然后,我得到了AttributeError消息: AttributeError: Cannot find 'price' on Book object, 'price' is an invalid parameter to prefetch_related(

我在django 1.4中尝试了从trunk预取_related(),但无法预取反向查找

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

我的观点的疑问:

books = Book.objects.prefetch_related('price')
然后,我得到了AttributeError消息:

AttributeError: Cannot find 'price' on Book object, 'price' is an invalid parameter to prefetch_related()
如何让它工作? 谢谢。

请定义相关名称:

class Price(models.Model):
    book = models.ForeignKey(Book, related_name='prices')
然后使用它:

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

如果没有为关系定义
相关的\u名称
,则反向关系会附加
\u集
。从对象访问反向关系时会出现这种情况(例如
some\u book.price\u set.all()
),但这也适用于
prefetch\u相关的

books = Book.objects.prefetch_related('price_set')
请注意,这似乎与filter不同,filter接受不带
\u set
(例如
Books.objects.filter(price\u currency='EUR')
)的其他型号的名称

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


或者,您可以添加一个
相关的\u名称
,如上面的Jan pöschko所示。

您的回答让我想起了FOO\u集,因此更正也可以是.prefetch\u相关的('price\u set')。顺便说一句,谢谢你,我不能在壳里复制这个。仍然做单独的查询,我期待加入。你好!我也尝试过这个,但正如@pdvyas所说的,有不同的查询。这不会进行连接…
prefetch\u related
不会进行连接,它只是收集相关对象ID,然后在单个查询中获取这些对象,并在Python中生成这些“连接”。请参阅:@jan-pöschko,定义
相关的\u名称
似乎是一个(更容易的)替代方法,即使用
价格集
名称来引用关系。我已经添加了一个描述这一点的答案,但也许最好在你的(公认的)答案中引用我的答案,或者在你的?books=Book.objects.prefetch_related('price_set')@Jonathanz:你应该把你的评论作为公认的答案,即
prefetch_related('price_set')
books = Book.objects.prefetch_related('price_set')