给定一个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
对象,以提供给序列化器。很明显我会用SQL来表达它,但我不能用ORM来表达它。
**更新:**我已经想出了一个绝对可怕的解决方法来处理外部连接,那就是再次过滤,但必须有一个更好的方法:
team.players.annotate(
filter_team_id=F('membership__team_id'),
is_manager=F('membership__is_manager'),
).filter(
filter_team_id=team.id
)
1条答案
按热度按时间kulphzqa1#
.但这会导致成员资格返回到玩家的外部联接。
在Django 3.2上,原始查询看起来并没有那么糟糕。至少它 * 不 * 包含 * 外部连接 *,据我所知:
会产生类似于
(为清晰起见,缩短了表名)
如果更频繁地需要注解,则可以添加自定义管理器方法,尽管这不会修改实际的查询。举例来说: