Django: 预取相关()是否遵循反向关系查找?

我已经在 django 1.4的主干中尝试过 prefethrelated() ,但是无法进行预取反向查找。

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

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()

怎么才能成功? 谢谢。

40022 次浏览

定义一个相关的名称:

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

然后使用它:

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

当您没有为关系定义 related_name时,反向关系将追加 _set。当从对象(例如 some_book.price_set.all())访问反向关系时就是这种情况,但是这也适用于 prefetch_related:

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

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

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

或者,您可以添加一个 related_name,如上面的 Jan Pöschko 所示。