如何使用Django ORM筛选出指定字段为最大值的记录
实现方案
你可以通过Django ORM的聚合查询能力实现需求,无需提前知晓number的最大值,以下是两种常用写法:
写法1:分两步查询(可读性高)
先通过Max聚合函数拿到number字段的最大值,再用该值作为过滤条件查询用户,会执行2次数据库请求:
from django.db.models import Max # 第一步:获取number的最大值 max_num = User.objects.aggregate(max_number=Max('number'))['max_number'] # 第二步:查询所有number等于最大值的用户 max_users = User.objects.filter(number=max_num)
该写法逻辑简单易懂,适合绝大多数业务场景,能正确返回示例中的Jack、Carla两个符合条件的用户。
写法2:子查询(仅1次数据库请求)
如果需要优化数据库请求次数,可以将最大值查询封装为子查询,仅执行1次数据库请求就能拿到结果:
from django.db.models import Subquery # 子查询先拿到最大的number值,外层直接用该值过滤 max_users = User.objects.filter( number=Subquery( User.objects.order_by('-number').values('number')[:1] ) )
该写法适合对接口性能要求较高的场景,返回结果和写法1完全一致。
内容的提问来源于stack exchange,提问作者user17049514
相关产品推荐
相关产品推荐

