如果我有父模型和子模型,那么如何列出父对象的所有子对象,并为每个子对象分配过滤计数,列出它们时?
举个例子,假设我们有这些模型:
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中完成。我只是这样写它来澄清我的意思。那么,我怎样才能实现这样的目标呢?
答案 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 %}