我有这些模特:
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')
我正在尝试排序获得最多胜利的Team
列表。我目前有这个算法,它可以工作,但速度很慢:
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
个对象。
答案 0 :(得分:1)
看起来你正试图根据胜利次数对球队进行排序。在这种情况下,您可以使用相关联盟获胜的数量对每个Team
对象进行注释,然后按递减顺序对这些获胜次数进行排序:
from django.db.models import Count
teams = Team.objects.annotate(num_wins=Count('alliance__winner')).order_by('-num_wins')