计算模板中过滤的子查询

时间:2014-05-12 22:04:11

标签: python django django-models django-views django-filter

如果我有父模型和子模型,那么如何列出父对象的所有子对象,并为每个子对象分配过滤计数,列出它们时?

举个例子,假设我们有这些模型:

class Category(models.Model):
    ...

class SubCategory(models.Model):
    category = models.ForeignKey(Category)
    ....

class Tag(models.Model):
    ....

class Article(models.Model)
    sub_category = models.ForeignKey(SubCategory)
    tag = models.ForeignKey(Tag)

然后我们有一个类别的DetailView,其中列出了该类别的所有SubCatoegories。在此列表中,我们希望对每个SubCategory条目进行计数,其中包含属于某个标记的文章数量(即,不计算 all SubCategory的文章,这些文章似乎更容易构建)。像这样:

{% for sub_category in category.sub_category_set.all %}
    {{ sub_category.name }} -- {{ sub_category.articles_set.filter(tag='xyz').all|length }}

我想这必须以某种方式在views.py和/或models.py中完成。我只是这样写它来澄清我的意思。那么,我怎样才能实现这样的目标呢?

1 个答案:

答案 0 :(得分:1)

你是对的,你必须在视图中这样做。您可以使用注释来获取每个子类别的已过滤文章的数量:

from django.db.models import Count

def my_view(request, other, arguments):
    ...
    subcategories = category.sub_category_set.filter(tag__tagname='xyz') \ 
                            .annotate(num_articles=Count('article__id'))
    ...

subcategories传递到模板上下文,然后在模板中执行以下操作:

{% for subcategory in subcategories %}
    {{ subcategory.name }} -- {{ subcategory.num_articles }}
{% endfor %}
相关问题