【问题标题】:Django order_by() returning wrong querysetDjango order_by() 返回错误的查询集
【发布时间】:2018-05-02 21:30:06
【问题描述】:

我正在尝试通过一个查询集获取一个列表,该查询集为我提供了一个包含跨不同模型的字段的有序列表。

我有两个模型:

class Team(models.Model):
    total_score = models.PositiveSmallIntegerField(default=0)

    class Meta:
        ordering = ['-total_score']

class Individual(models.Model):
    team = models.ForeignKey(Team, on_delete=models.CASCADE, related_name='individuals')
    score = models.PositiveSmallIntegerField(default=0)

    class Meta:
        ordering = ['-score']

这是我正在使用的查询集:

Team.objects.order_by('-total_score', '-individuals__score')

据我了解,这将按总分降序排列,然后是个人得分降序排列。但是,每当我有总分相同的团队和这些团队中的个人得分相似时,此查询集不会比较不同团队的每个个人得分。我该如何解决?我正在尝试根据个人得分对这些团队进行排名并打破平局。我正在使用 postgresql。

编辑

例如,如果我有:

A队:玩家一=10,玩家二=10,玩家三=5,玩家四=0(总计 = 25

B队:选手一=10,选手二=10,选手三=3,选手四=2(总计 = 25

B队:选手一=10,选手二=10,选手三=2,选手四=2(总计 = 24

我希望此查询返回 Team A、Team B、Team C。但它给了我 Team B、Team A、Team C。

我有一个去除重复项的功能:

teams = Team.objects.order_by('total_score', '-individuals__score')
    for team in teams:
        if squad not in dup_list:
            dup_list.append(team)
            rank_list.append(team)
    teams = rank_list

    return rank_list

【问题讨论】:

  • 做一个 print(Team.objects.order_by('-total_score', '-individuals__score').query) 并检查 SQL 并查看它对你的影响。
  • 不清楚您希望通过'-individuals__score' 命令团队做什么。它将多次返回相同的团队对象,对于查询集中的每个人一次。请参阅note in the docs 了解更多信息。
  • 我添加了更多细节@Alasdair 你能弄清楚发生了什么吗?

标签: django


【解决方案1】:

当您对-individuals__score 进行排序时,每个团队都会出现多次,每个人出现一次。

然后根据那个个人对团队进行排序。您想根据该团队的个人得分列表进行排序,例如比较[10,10,5,0][10,10,3,2]。你也许可以用expressions 做到这一点,但我无能为力。

如果您使用 Postgres,一种选择可能是将 ArrayField 添加到 Team,存储像 [10,10,5,0] 这样的值,然后根据它进行排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    相关资源
    最近更新 更多