Пытаясь найти 5 самых популярных записей - PullRequest
1 голос
/ 24 января 2012

Я пытаюсь найти наиболее травмированного игрока по моему запросу, но у меня возникают проблемы с получением правильных результатов.

Я думал о том, чтобы поместить идентификаторы игроков в список, но как вы посчитаете дублирующиеся записи и затем создадите список "5 самых раненых"?

Вот мои модели.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)

и что у меня есть пока для моих views.py
EDIT

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))

Ответы [ 3 ]

4 голосов
/ 24 января 2012

Почему бы просто не использовать аннотации ?

from django.db.models import Count

Player.objects.annotate(injury_count=Count('playerinjury')).order_by('-injury_count')[:5]
2 голосов
/ 24 января 2012

Если вы используете 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 , вероятно, более целесообразно; тяжелая работа произойдет в вашей базе данных.

1 голос
/ 24 января 2012

Используйте словарь , где ключ - это имя игрока, а значение - счетчик того, сколько раз игрок получил травму.Выполните итерацию по вашим данным и увеличивайте значение каждой записи словаря в любом случае травмы.

Они являются основной концепцией использования словаря в этом сценарии:

Ключи уникальны в словаре, в то время как значенияможет не быть.Значения словаря могут быть любого типа, но ключи должны быть неизменного типа данных, такого как строки, числа или кортежи.

Чтобы получить топ-5, вы могли бы затем создать списокэто вид словаря по значению .

...