Существует ли метод, позволяющий присоединить один уровень к родственному_имени?

Я неоднократно сталкиваюсь с ситуацией с данными, для которых, как мне кажется, в django, вероятно, есть ярлык, но я не могу его найти...

Я хочу получить доступ к модели на одно отношение за пределами выбранного мною набора запросов через related_name. Кажется, что для этого должна быть одна строка, но лучшее, что я придумал, это:

for p in team.players:
   do_whatever(p.user.email)

Использование select_related приведет к предварительному кэшированию данных, но не даст мне их в пригодной для использования форме.

team.players.select_related('user')  # still returns queryset of Players, not Users

Просто кажется, что должен быть какой-то способ получить набор связанных user запросов одним вызовом. Что-то вроде annotate:

users = team.players.annotate('user')   # doesn't work

Есть ли метод, который делает то, что я ищу? Или цикл "for - in" является единственным способом?

Основы моих занятий (сильно упрощенные):

class Team(models.Model):
   name = models.CharField()

class Player(models.Model):
   team = models.ForeignKey(Team, on_delete=models.CASCADE, related_name="players")
   user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="players")
   captain = models.BooleanField()

Есть ли какая-нибудь одна строка или оптимизация, помимо выполнения select_related с последующим for-in?

Вы можете .filter(…) [Django-doc] с:

User.objects.filter(players__team=team)

This will retrieve all the Users for which there is a Player object that refers to the team. If a User can be part of the team multiple times, you can use .distinct() [Django-doc] to retrieve each User at most once:

User.objects.filter(players__team=team).distinct()
Вернуться на верх