如何用Django ORM实现分组统计、最大值及关联字段查询?
Django ORM实现分组统计及关联对应字段值
假设你的Django模型定义如下(字段对应问题中的A、B、C):
from django.db import models class MyModel(models.Model): a = models.CharField(max_length=100) # 对应字段A b = models.IntegerField() # 对应字段B c = models.CharField(max_length=100, unique=True) # 对应字段C,唯一约束 class Meta: db_table = 'your_table_name' # 替换为实际数据表名
要实现按a分组,统计每个分组的出现次数、b字段的最大值,以及该最大值对应的c字段值,可以通过**子查询(Subquery)+ 分组注解(annotate)**来完成:
步骤1:导入必要的ORM工具
from django.db.models import Count, Max, Subquery, OuterRef
步骤2:构建子查询获取每个分组中b最大值对应的c值
因为c字段唯一,每个a分组中b最大值对应的记录唯一(若存在多条b值相同的最大记录,会取排序后的第一条):
# 子查询:筛选当前分组的a值,按b降序排序后取第一条的c值 max_b_c_subquery = MyModel.objects.filter(a=OuterRef('a')).order_by('-b').values('c')[:1]
步骤3:执行主查询完成分组统计
query_result = MyModel.objects.values('a').annotate( count=Count('a'), # 统计每个a的出现次数 max_b=Max('b'), # 获取每个分组中b的最大值 c_for_max_b=Subquery(max_b_c_subquery) # 关联对应b最大值的c值 ).order_by('a') # 按a字段排序结果
结果说明
返回的query_result是一个QuerySet,每个元素是字典结构,示例如下:
# 输出示例 <QuerySet [ {'a': 'a_value1', 'count': 3, 'max_b': 100, 'c_for_max_b': 'c_unique_value1'}, {'a': 'a_value2', 'count': 5, 'max_b': 200, 'c_for_max_b': 'c_unique_value2'}, ... ]>
内容的提问来源于stack exchange,提问作者majestic_centaur
相关产品推荐
相关产品推荐

