django filter 统计数量 按属性去重

在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求:

方法1:使用annotate()和Count

假设你有一个模型Item,并且你想根据category字段来去重并统计每个类别的数量,你可以这样做:

cpp 复制代码
from django.db.models import Count
 
result = Item.objects.values('category').annotate(count=Count('id')).order_by()

这里,values('category')会为每个不同的category创建一个字典,然后annotate(count=Count('id'))会对这些字典中的每个category进行计数,其中Count('id')会统计每个组中id的数量(即每个类别的项目数量)。

方法2:使用distinct()

如果你只需要一个简单的去重统计而不关心计数,可以使用distinct()方法:

cpp 复制代码
result = Item.objects.values('category').distinct().count()

这将返回每个不同category的数量。但请注意,这种方法实际上会先对所有记录进行去重,然后计数,这可能不是最高效的方法,尤其是在大数据集上。

方法3:结合使用annotate()和条件过滤

如果你想要在统计前对某些条件进行过滤,可以这样做:

cpp 复制代码
from django.db.models import Count
 
result = Item.objects.filter(is_active=True).values('category').annotate(count=Count('id')).order_by()

这里,filter(is_active=True)会在进行去重和计数前先过滤出所有is_active为True的记录。

方法4:使用子查询或原始SQL(复杂情况)

对于更复杂的去重和统计需求,你可能需要使用子查询或者原始SQL。例如,使用子查询来统计每个类别的唯一项目数:

cpp 复制代码
from django.db.models import Count, OuterRef, Subquery
 
subquery = Item.objects.filter(category=OuterRef('category')).distinct().values('id').annotate(item_count=Count('id'))
result = Item.objects.values('category').annotate(count=Subquery(subquery.values('item_count')[:1]))

这种方法使用了子查询来确保在计算数量时只考虑唯一的项目。

总结

选择哪种方法取决于你的具体需求,例如是否需要过滤、是否需要排序、是否需要处理复杂的去重逻辑等。通常,对于简单的去重和计数需求,方法1和方法2就足够了。对于更复杂的情况,方法3和方法4提供了更多的灵活性。

相关推荐
倔强的石头_10 小时前
《Kingbase护城河》——猎捕慢查询:执行计划的微观解析与索引调优实战
数据库
SelectDB12 小时前
Apache Doris Python UDF:让 SQL 直接调用 Python 生态,支撑 Agent 时代复杂业务逻辑
大数据·数据库·python
jiayou642 天前
KingbaseES 表级与列级加密完全指南
数据库·后端
GBASE2 天前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
xiezhr3 天前
逛GitHub发现了一款免费的带AI功能的数据库管理工具
数据库·ai编程·dba
吃糖的小孩4 天前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
笃行3505 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3505 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库
笃行3505 天前
金仓数据库逻辑备份实战:从全库导出到 Schema 替换的完整闭环
数据库