我正在尝试从我的查询中找到受伤最严重的玩家,但我无法获得正确的结果。
我想把玩家ID放在一个列表中,但是你如何计算重复的条目然后产生一个“前5名”最受伤的名单?
这是我的models.py
class PlayerInjury(models.Model):
player = models.ForeignKey(Player)
injury_type = models.ForeignKey(Injury)
injury_date = models.DateField(verbose_name='Injured On', null=True, blank=True)
description = models.CharField(verbose_name='Description', max_length=180, null=True, blank=True)
status = models.ForeignKey(Status)
projected_return = models.DateField(verbose_name='Projected Return Date', null=True, blank=True)
hide = models.BooleanField(default=False)
returned = models.BooleanField(default=False)
timestamp = models.DateTimeField(auto_now_add=True)
到目前为止我的观点 的修改
def home(request):
context={}
player_list = []
most_recent = PlayerInjury.objects.all().order_by('-timestamp')[:5]
news = News.objects.all()
most_injured = PlayerInjury.objects.annotate(injury_count=Count('id')).order_by('-injury_count')[:5]
context['most_injured'] = most_injured
context['most_recent'] = most_recent
context['news'] = news
return render_to_response('dash/home.html', RequestContext(request, context))
答案 0 :(得分:4)
为什么不使用annotations?
from django.db.models import Count
Player.objects.annotate(injury_count=Count('playerinjury')).order_by('-injury_count')[:5]
答案 1 :(得分:2)
如果你使用的是2.7,那么纯粹的python解决方案就是
from collections import Counter
inj_counts = Counter()
for ip in all_intered_players:
inj_counts[ip.player_id] += 1
inj_counts.most_common(5) # gives you a list of top five [(player_id, num_injuries), ...]
虽然使用django's annotation feature可能更合适;然后,繁重的工作将在您的数据库中发生。
答案 2 :(得分:1)
使用dictionary,其中键是玩家的名字,值是玩家受伤多少次的计数器。迭代您的数据并在任何伤害实例上递增每个词典条目的值。
他们在这种情况下使用字典的主要概念:
键在字典中是唯一的,而值可能不是。该 字典的值可以是任何类型,但键必须是 不可变数据类型,如字符串,数字或元组。
要获得前五名,您可以生成一个sort of the dictionary by value的列表。