【问题标题】:Get count on filtered subqueries in template获取模板中过滤子查询的计数
【发布时间】:2014-06-30 10:38:40
【问题描述】:

如果我有一个父模型和一个子模型,那么如何列出父对象的 所有 个子对象,并为每个子对象设置一个 已过滤 个计数,什么时候列出?

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

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)

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

{% 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.文章有sub_category FK吗? 2. sub_category.articles_set.filter(tag='xyz').count()有什么问题?
  • 1.不,只有 sub_category 的文章。 2. 我认为您不能在模板中进行过滤。

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


【解决方案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 %}

【讨论】:

  • 工作就像一个魅力!非常感谢!
  • 即使有 0 篇带有 tag='xyz' 的文章,我怎样才能让它工作?
  • 你似乎对此很了解,所以也许你可以看看我的新问题,它扩展了这个问题:stackoverflow.com/questions/23636343/…
猜你喜欢
  • 2014-07-01
  • 2021-07-17
  • 2015-11-17
  • 2020-10-04
  • 2015-01-29
  • 2012-08-22
  • 2018-09-02
  • 2019-06-06
  • 2023-04-11
相关资源
最近更新 更多