我有以下型号:-
class Group(models.Model):
name = models.CharField(max_length=200)
class Game(models.Model):
group = models.ForeignKey(Group, related_name='games')
date = models.DateField()
players = models.ManyToManyField(
Player, through='GameMembership', related_name='games'
)
class GameMembership(models.Model):
game = models.ForeignKey(Game, related_name='memberships')
player = models.ForeignKey(Player, related_name='memberships')
selected = models.BooleanField(default=False)
injured = models.BooleanField(default=False)
class Player(models.Model):
group = models.ForeignKey('groups.Group', related_name='players')
user = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='players')
我想用计算如下的分数来注释组中的所有玩家:-
在最近 10 场比赛中没有球员受伤的比赛中,如果他们被选中,得 5 分。
如果我忽略“未受伤”子句,我可以使用 Sum/Case/When 来执行此操作,方法是在 Player 上使用如下所示的管理器方法:-
def with_availability_scores(self, group):
for_games = group.games.reverse()[:10]
return self.annotate(
availability_score=Sum(Case(
When(
memberships__selected=True, memberships__game__in=for_games,
then=5)
default=0, output_field=IntegerField()))
)
但是添加“受伤”子句意味着我不能像开始那样使用那个 for_games 变量。
我怀疑它可以使用 Subquery 和 OuterRef 来完成,但我无法弄清楚我需要的确切语法。
有任何想法吗?