首页 > 解决方案 > 根据多个字段的最大值对 Django 模型进行排序

问题描述

我有一个为团队存储数据的模型。对于每场比赛(比赛 1、比赛 2 等),每支球队都有三个存储点值的字段。我需要能够根据三场比赛中的任何一场比赛中的最高分对这些球队进行排序,但 Django 的 order_by 方法仅根据一个值的最大值进行排序。有没有办法让我提供多个参数并让它在排序时选择最大值?这是我的代码到目前为止的样子:

#models.py
class Team(models.Model):
    match1 = models.CharField(max_length=4, blank=True, default="/")
    match2 = models.CharField(max_length=4, blank=True, default="/")
    match3 = models.CharField(max_length=4, blank=True, default="/")
#views.py
def team_rankings(request): # Scoreboard/rankings of teams
    context = {
        'teams': Team.Objects.all().order_by(#All three match results here)
    }
    return render(request, 'scoring_system/rankings.html', context)

标签: django

解决方案


您可以向您添加一个函数,该函数class Team返回这些匹配项的最大值,例如:

#models.py
class Team(models.Model):
    match1 = models.CharField(max_length=4, blank=True, default="/")
    match2 = models.CharField(max_length=4, blank=True, default="/")
    match3 = models.CharField(max_length=4, blank=True, default="/")

    def highest(self):
        # Compares self.match1, self.match2, self.match3 and returns highest

然后,您可以使用以下方法对它们进行排序:

#views.py
def team_rankings(request): # Scoreboard/rankings of teams
    context = {
        'teams': sorted( Team.objects.all(), key=lambda x: x.highest() )
    }
    return render(request, 'scoring_system/rankings.html', context)

推荐阅读