Django 1.7.7通过双关系获取模板中的对象计数

时间:2015-07-23 11:14:09

标签: django django-models django-templates

我有3个模型,Entry模型和Category模型,我创建了中间模型CategoryEntry。

class Entry(models.Model):
    entry_text = models.TextField()

class Category(models.Model):
    user = models.ForeignKey(User)
    category_text = models.CharField(max_length=200)
    entries = models.ManyToManyField(Entry, through='CategoryEntry')

class CategoryEntry(models.Model):
    category = models.ForeignKey(Category, related_name="related_entry_categories")
    entry = models.ForeignKey(Entry)
    viewed = models.BooleanField(default=False)

如何进入模板用户总计入门次数。 例如,我可以通过

获得总用户类别计数
{{ user.category_set.count }}

所以我尝试了很多不同的方法,但不知道如何遵循下一个关系

{{ user.category_set.entries.count}}
{{ user.category_set.categoryentry_set.count}}
{{ user.category_set.all.categoryentry_set.count}}
{{ user.category_set.related_entry_categories.count }}

这甚至可以(好的事情)计算模板吗?或者有更好的方法吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

您的查询没有意义,因为category_set是对象的集合而不是单个对象,因此您不能简单地要求category_set.entries.count

首先你必须考虑你想要的......你想要的吗?

  • category_set中每个类别的条目的个别计数?
  • category_set所有类别中的条目总数?

对于前者,您需要annotate查询集。这必须在视图而不是模板中完成,因为该方法需要参数:

from django.db.models import Count

user_categories = user.category_set.annotate(entry_count=Count('entries'))
# then pass the user_categories queryset into your template along with user

然后,您可以在模板中迭代user_categories以显示各个计数:

{% for category in user_categories %}
    No. of entries: {{ category.entry_count }}
{% endfor %}

对于后者,您可以在视图中再次使用aggregate

from django.db.models import Count

total = user.category_set.aggregate(entry_count=Count('entries'))
# note that aggregate method returns a dict:
print total['entry_count'] 
# then pass total['entry_count'] as a value into your template along with user