You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django模板中过滤并统计QuerySet数量(避免视图处理)

在Django模板中直接统计已支付/未支付应用数量

嘿,这个需求完全合理——咱们确实没必要把所有数据处理逻辑都堆在视图里,模板层面就能优雅搞定!给你两种实用的方案,按需选择:

方案1:自定义模板过滤器(推荐,性能最优)

这种方法直接在数据库层面完成过滤计数,不会把所有对象加载到内存,适合数据量较大的场景。

步骤1:创建自定义过滤器

在你的Django app里新建一个templatetags文件夹(记得加__init__.py文件让Python识别为包),然后创建custom_filters.py文件,写入以下代码:

from django import template

register = template.Library()

@register.filter(name='count_by_paid')
def count_by_paid(queryset, is_paid):
    # 直接调用QuerySet的filter和count方法,数据库层面完成统计
    return queryset.filter(is_paid=is_paid).count()

步骤2:在模板中使用过滤器

先加载自定义过滤器,然后直接调用即可:

{% load custom_filters %}

<body>
All: {{ applications.count }}
Paid: {{ applications|count_by_paid:True }}
UnPaid: {{ applications|count_by_paid:False }}
</body>

方案2:使用内置regroup标签(无需写Python代码)

如果不想额外写过滤器,Django内置的regroup标签也能实现,不过它会把所有应用对象加载到内存里,小数据量场景用起来很方便:

<body>
All: {{ applications.count }}
{% regroup applications by is_paid as paid_groups %}
{% for group in paid_groups %}
    {% if group.grouper %}
        Paid: {{ group.list|length }}
    {% else %}
        UnPaid: {{ group.list|length }}
    {% endif %}
{% endfor %}
</body>

两种方案对比

  • 自定义过滤器:性能更好,代码可复用,适合生产环境或数据量较大的情况。
  • regroup标签:零Python代码,快速实现,适合小型项目或临时需求。

内容的提问来源于stack exchange,提问作者Amin Ba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:47:13