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

