Сортировать по полю связанных объектов в Django - PullRequest
0 голосов
/ 15 апреля 2020

У меня есть две модели, Player и Match

class Player(PlayerModel):
    points = models.PositiveIntegerField(default=0)
    games_played = models.PositiveIntegerField(default=0)
    wins = models.PositiveIntegerField(default=0)
    draws = models.PositiveIntegerField(default=0)
    defeats = models.PositiveIntegerField(default=0)
    goals_scored = models.PositiveIntegerField(default=0)
    goals_conceded = models.PositiveIntegerField(default=0)
    goal_difference = models.IntegerField(default=0)


class Match(models.Model):
    player1 = models.ForeignKey(Player, on_delete=models.CASCADE, related_name='player1')
    player2 = models.ForeignKey(Player, on_delete=models.CASCADE, related_name='player2')
    score1 = models.PositiveIntegerField(null=True, blank=True)
    score2 = models.PositiveIntegerField(null=True, blank=True)
    winner = models.ForeignKey(Player, null=True, blank=True, on_delete=models.CASCADE,related_name='winner')

Я хочу отсортировать объекты модели Player по их точкам, если точки равны, то по goal_difference, а если goal_difference равно, то я должен проверить посмотрите, кто выиграл матч между игроками с равными очками (поле победителя объекта Match).

def head_to_head():
table_list = []
match = Match.objects.all()
for m in match:
    if m.player1 not in table_list:
        table_list.append(m.player1)
    if m.player2 not in table_list:
        table_list.append(m.player2)
    table_list.sort(key=lambda x: (x.points, x.goal_difference), reverse=True)

Но я не могу понять, как сортировать по матчам один на один.

1 Ответ

0 голосов
/ 15 апреля 2020

Если вам нужно сравнить только двух игроков, есть только один матч, и игроки гарантированно сыграли друг против друга, тогда я рекомендую провести следующий матч:

from django.db.models import Q

def head_to_head(player1, player2):
    match = Match.objects.get(
        Q(player1=player1, player2=player2) |
        Q(player1=player2, player2=player1)
    )
    return match.winner

Я не знаю Не знаю, какой механизм вы используете, чтобы указать приоритет операций упорядочения, но это определение head_to_head действует как компаратор между двумя игроками. Я добавил фильтр Q, чтобы вы могли фиксировать совпадение между двумя игроками независимо от порядка их записи.

Чтобы использовать этот компаратор, вы можете взять список Player объектов и используйте python s sorted встроенный с head_to_head переданным для параметра key:

sorted(player_list, key=head_to_head)
...