Учитывая 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)