python - 根据另一个查询集的长度对一个查询集进行排序

标签 python mysql django performance python-3.x

我有这些模型:

class Team(models.Model):
    # stuff

class Alliance(models.Model):
    teams = models.ManyToManyField(Team)

class Match(models.Model):
    alliances = models.ManyToManyField(Alliance)
    winner = models.ForeignKey(Alliance, null=True, related_name='winner')

我正在尝试按获胜次数最多的团队排序列表。我目前有这个算法,它可以工作,但非常慢:

from collections import Counter
def most_match_wins(n=None):
    matches = Match.objects.filter(winner__isnull=False)
    count = Counter()
    for m in matches:
        for team in m.winner.teams.all():
            count[team] += 1

    return count.most_common() if n is None else count.most_common(n)

我现在正在尝试使用 Django 提供的聚合/注释来改进它。然而,我遇到了障碍。我可以通过执行以下查询来检索 Team 的获胜次数:

Match.objects.filter(winner__in=my_team_object.alliance_set.all()).count()

现在我不知道该去哪里。 django.db.models.Count 似乎没有提供我正在寻找的功能,django.db.models.F/django 也是如此.db.models.Q.

如有任何帮助,我们将不胜感激。也许我只是没有正确考虑 F/Q 对象。

最佳答案

您似乎正在尝试根据球队的获胜次数对球队进行排序。在这种情况下,您可以使用其相关联盟所获得的胜利次数来注释每个 Team 对象,然后按这些胜利次数降序排列:

from django.db.models import Count
teams = Team.objects.annotate(num_wins=Count('alliance__winner')).order_by('-num_wins')

关于python - 根据另一个查询集的长度对一个查询集进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37691211/

相关文章:

php - 在一个查询中在 MySQL 中执行插入/更新的最佳方法是什么?

python - Django 任务管理系统

django session 不在 iframe 中维护

python - 如何解决 ssl.socket 问题

php - 调用非对象上的成员函数(包括database.php)

php - 使用 SonataAdminBundle 处理 simple_array

python - Django - 模板标签内的标签

python - 将 CSV 从两行转换为带有时间戳的列

python - 你如何评估 Python 中数组的某个部分?

python - 从多维数组到层次结构