Django: следует ли prefetch_related () обратному поиску отношений? - PullRequest
46 голосов
/ 07 февраля 2012

Я пробовал prefetch_related () в django 1.4 из транка и не могу сделать предварительную выборку обратного просмотра.

Мои упрощенные модели (каждая книга имеет много цен):

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 ]

81 голосов
/ 07 февраля 2012

Определите связанное имя:

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

и затем используйте его:

books = Book.objects.prefetch_related('prices')
13 голосов
/ 15 февраля 2018

Если вы не определили 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, как показано Яном Пешко выше.

...