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

如何用Django ORM按name分组后获取每个分组的最新全字段记录

完全可以仅通过Django ORM实现该需求,不需要手动循环处理,根据你使用的数据库不同,可以选择以下两种方案:


方案1:PostgreSQL数据库(最优)

PostgreSQL支持DISTINCT ON语法,直接一条查询即可实现:

wish_data = Model.objects.filter(**conditions)\
            .order_by('name', '-create_date')\
            .distinct('name')\
            .values('name', 'data1', 'data2', 'create_date')

逻辑说明:先按name分组,同组内按create_date倒序排序,distinct('name')会保留每个name对应的第一条记录,也就是最新时间的全字段数据,完全匹配你的预期结果。


方案2:通用方案(兼容MySQL、SQLite等所有数据库)

如果用的不是PostgreSQL,可以用子查询实现,数据库层面完成过滤,效率远高于手动遍历:

from django.db.models import OuterRef, Subquery

# 子查询:查询每个name对应最新记录的id
latest_subquery = Model.objects.filter(
    name=OuterRef('name')
).order_by('-create_date').values('id')[:1]

# 主查询:直接过滤出所有最新记录
wish_data = Model.objects.filter(
    **conditions,
    id=Subquery(latest_subquery)
).values('name', 'data1', 'data2', 'create_date')

你写的手动循环逻辑思路是对的,但存在语法错误(未定义data变量、字典赋值格式错误),且数据量大的时候需要把全量数据拉到Python内存中处理,性能远低于ORM直接查询数据库的方案。

内容的提问来源于stack exchange,提问作者SungHun Jung

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 14:24:04