1

ближе всего к тому, что я спрашиваю, можно найти heredjango- Использование prefetch_related внутри другого prefetch_related

Скажем, у меня есть следующие модели:

class Division(models.Model): 
    name = models.TextField() 
    state = models.IntegerField() 

class Team(models.Model): 
    name2 = models.TextField() 
    division = models.ForeignKey(Division, ...) 

class Player(models.Model): 
    name = models.TextField() 
    hometown = models.IntegerField() 
    team = models.ForeignKey(Team, ...) 

Теперь я уже могу сделать следующее для только один таблица:

players = Player.objects.prefetch_related('team') 

Как бы идти о добавлении state к QuerySet? Мой endgoal должен иметь возможность делать player.team.division.state внутри шаблона. Другой альтернативой было бы использование вложенных циклов, но я хотел бы избежать этого.

+0

Ваши примеры моделей трудно понять, потому что они имеют очень похожие имена и поля. Не существует поля foreign key/many-to-many от другой модели до 'model3', поэтому нет причин использовать' prefetch_related' здесь. Простой 'select_related' будет работать. – Alasdair

+0

@Alasdair Пожалуйста, взгляните на мое редактирование – mjr

ответ

2

Здесь не нужно prefetch_related. Вы можете использовать внешние ключи от Player до Team до Division, используя select_related().

players = Player.objects.select_related('team__division') 

Применение случай для prefetch_related, если вы начали с Division QuerySet, и хотели, чтобы принести соответствующие команды в то же время.

+0

Не уверен, что это должен быть другой вопрос, но: как я могу получить команду и игроков в 1 запросе, даже если у команды нет игрока? – mjr

+1

Это отдельный вопрос. Прежде чем задать новый вопрос, просмотрите документы [связанные с предварительной выборкой] (https://docs.djangoproject.com/en/1.9/ref/models/querysets/#prefetch-related). Примеры моделей очень похожи на ваши. Вы можете использовать предварительную выборку, относящуюся к вашему обратному внешнему ключу, от команды к игроку, так же, как они используют его для полей «многие ко многим». – Alasdair

+0

Я нашел [документацию по объектам предварительной выборки] (https://docs.djangoproject.com/en/dev/ref/models/querysets/#prefetch-objects), чтобы быть чрезвычайно полезным. – mjr