Комплексная аннотация Джанго - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть следующие модели: -

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()))
        )

Но добавление предложения "injured" означает, что я не могу использовать эту переменную for_games для начала.

Я подозреваю, что это можно сделать с помощью Subquery и OuterRef, но я не могу точно понять, какой именно синтаксис мне нужен.

Есть идеи?

...