Django:一种分组和计算对象的简单方法?

时间:2014-02-27 14:02:24

标签: django django-models django-templates

我想做一些非常简单但却找不到办法的方法。

models.py:

class Reward:
    name = models.CharField(max_length=50)
    # other stuff

class UseRewardEvent:
    reward = models.ForeignKey(Reward)
    # other stuff

最后,我想打印一张带有奖励名称和奖励名称的活动数量的表格。

例如

如果UseRewardEvent.objets.all()包含3个链接的reward.name为的对象:

  • “免费鸡”
  • “免费鸡”
  • “自由兔子”

和Reward.objects.all()包含3个名称为的对象:

  • “免费鸡”
  • “自由兔子”
  • “自由牛”

这应该在我的模板中打印一个包含以下使用奖励的表格:

  • 免费鸡肉 - > 2
  • 免费兔子 - > 1
  • 自由牛 - > 0(因为没有带有reward.name等于'自由牛'的UseRewardEvent)

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

这是aggregation的用途。

from django.db.models import Count
Reward.objects.annotate(use_count=Count('userewardevent'))

答案 1 :(得分:0)

for reward in Reward.objects.all():
    print reward,'->',len(reward.userewardevent_set.all())

用于模板

{% for reward in Reward.objects.all %}
<p>{{ reward }} --> {{ reward.userewardevent_set.all|length }}</p>
{% endfor %}

使用 reward.userewardevent_set 获取相关信息,它是一个RelatedManager,充当 reward.objects

根据Daniel Roseman提高效率,thx!

for reward in Reward.objects.all():
    print reward,'->',reward.userewardevent_set.count()

用于模板

{% for reward in Reward.objects.all %}
<p>{{ reward }} --> {{ reward.userewardevent_set.count }}</p>
{% endfor %}