Аннотация не отображается / работает должным образом - PullRequest
1 голос
/ 24 января 2012

Я задал этот вопрос об аннотации, чтобы найти 5 самых травмированных игроков, но теперь у меня возникла проблема с отображением правильной информации, и я решил, что это должен быть собственный вопрос.

Это мой текущий вид:

def home(request):
    context={}
    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]
    print most_injured
    context['most_injured'] = most_injured
    context['most_recent'] = most_recent
    context['news'] =  news
    return render_to_response('dash/home.html', RequestContext(request, context))

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)

class Player(models.Model):
    first_name = models.CharField(verbose_name='First Name', max_length=30, null=True, blank=True)
    last_name = models.CharField(verbose_name='Last Name', max_length=30, null=True, blank=True)
    team = models.ForeignKey(Team, related_name='Team played for')
    pob = models.CharField(verbose_name='Place of Birth', max_length=100, null=True, blank=True)
    dob = models.DateField()
    age =  models.IntegerField(null=True, blank=True)
    height = models.CharField(verbose_name='Height', max_length=10, null=True, blank=True)
    weight = models.CharField(verbose_name='Weight', max_length=10, null=True, blank=True)
    drafted_by = models.ForeignKey(Team, related_name='drafted by')

Однако, когда я распечатываю most_injured, я получаю:
- Игрок A
- Игрок Б
- Игрок A

Когда на самом деле я думал, что это должно отображаться как:
- Игрок A
- Игрок Б

Из-за того, что игрок A получил боль больше, чем игрок B

Есть предложения?

Я думал, что так оно и должно быть.
- Игрок А (2 травмы)
- Игрок Б (1 травма)
- и т. д.

Ответы [ 2 ]

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

Вы запрашиваете отдельные PlayerInjury объекты, поэтому, конечно, у вас есть несколько игроков в ваших результатах.

Если вы Count на id, вы всегда получите счетчик единиц, поскольку для каждого идентификатора существует только 1 объект.

Если вы хотите, чтобы объекты игрока были упорядочены по травмам, вам нужно

Player.objects.annotate(count=Count('playerinjury')).order_by('-count')
1 голос
/ 24 января 2012

Попробуйте вместо этого:

most_injured = Player.objects.annotate(injury_count=Count('playerinjury')).order_by('-injury_count')[:5]
...