Аннотировать поля из промежуточной модели из Django RelatedManager - PullRequest
1 голос
/ 24 января 2020

Учитывая Django промежуточную модель для ManyToManyField например,

class Player(models.Model):
  name = models.CharField(max_length=128)

class Team(models.Model):
  name = models.CharField(max_length=128)
  players = models.ManyToManyField(Player, through='Membership', related_name='teams')

class Membership(models.Model):
  player = models.ForeignKey(Player, related_name='membership')
  team = models.ForeignKey(Team, related_name='membership')
  is_manager = models.BooleanField()

Я хочу аннотировать поля из Membership в запросе соответствующего менеджера, например,

team = get_team()

team.players\
    .annotate(is_manager=F('membership__is_manager'))\
    .all()

Но это приводит к внешнему соединению memberships обратно к players.

Я знаю, что могу перевернуть запрос и запросить непосредственно к Membership, но мне нужно Player объекты для подачи в сериализатор. Кажется очевидным, как я express это в SQL, но я не могу понять, как express это в ORM.

Обновление: Я придумал абсолютно ужасный обходной путь для внешнего соединения, которое должно снова фильтроваться, но должен быть лучший способ:

team.players\
    .annotate(filter_team_id=F('membership__team_id'),
              is_manager=F('membership__is_manager'))\
    .filter(filter_team_id=team.id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...