如何在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
相关产品推荐
相关产品推荐

