Существует ли метод, позволяющий присоединить один уровень к родственному_имени?
Я неоднократно сталкиваюсь с ситуацией с данными, для которых, как мне кажется, в 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()