【问题标题】:Annotation not displaying/working properly注释无法正常显示/工作
【发布时间】:2012-01-24 19:12:37
【问题描述】:

我向question 询问了关于如何查找受伤最多的前 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
- 玩家 B
- 玩家 A

真的,我认为它应该显示为:
- 玩家 A
- 玩家 B

由于玩家 A 比玩家 B 受到的伤害更大

有什么建议吗?

我认为它应该是这样工作的。
- 球员 A(2 次受伤)
- 球员 B(1 次受伤)
- 等等

【问题讨论】:

  • 请发布您的模型。
  • Player 的模型是什么样的?

标签: python django django-templates django-views


【解决方案1】:

尝试这样做:

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

【讨论】:

  • ROFL。那是我给他在我的答案中使用的确切代码。不知道他为什么决定改变它,但感谢你在他提出问题之前提供他已经拥有的 OP 信息而获得积分。 ;)
  • 哎呀,感觉很脏,哈哈。在解决这个问题之前,我可能应该检查上一篇文章。看来裕二和我也并驾齐驱。他的回答可能更好,甚至,因为它包含了一些关于为什么改变你的答案是一个坏主意的解释。
  • @aganders3,这很有趣!我第一次看到“刚刚”两次。
【解决方案2】:

您正在查询单个 PlayerInjury 对象,因此您的结果中当然有多个玩家。

如果您通过id Count,您将始终得到一个计数,因为每个 id 只有 1 个对象。

如果你想要按受伤排序的玩家对象,你需要

Player.objects.annotate(count=Count('playerinjury')).order_by('-count')

【讨论】:

    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2012-01-31
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多