首页 > 解决方案 > 注释来自 Django RelatedManager 的中间模型的字段

问题描述

给定一个 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()

但这会导致membershipsback to的外部连接players

我知道我可以直接打开查询并查询Membership,但我需要的是Player输入序列化程序的对象。很明显我将如何在 SQL 中表达这一点,但我无法弄清楚如何在 ORM 中表达它。

更新:我想出了一个绝对可怕的外连接解决方​​法,即再次过滤,但必须有更好的方法:

team.players\
    .annotate(filter_team_id=F('membership__team_id'),
              is_manager=F('membership__is_manager'))\
    .filter(filter_team_id=team.id)

标签: djangodjango-orm

解决方案


推荐阅读