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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 04:05:13