You need to enable JavaScript to run this app. Django ORM如何单次查询实现多条件排序以适配分页需求
优惠活动
大模型
产品
解决方案
定价
更多

Django ORM如何单次查询实现多条件排序以适配分页需求

解决方案
  • 第一步:导入所需的ORM工具类
from django.db.models import Case, When, Value, IntegerField, Q
  • 第二步:修改get_queryset方法,使用条件表达式标注匹配优先级,单次查询完成过滤+排序
class RoomListView(ListAPIView):
    def get_queryset(self):
        search = 'test' # 示例搜索关键词,实际可从请求参数获取
        return Room.objects.filter(
            Q(name__icontains=search) | Q(owner__username__icontains=search)
        ).annotate(
            # 自定义优先级:所有者用户名匹配的权重为1,房间名匹配的权重为2
            priority=Case(
                When(owner__username__icontains=search, then=Value(1)),
                default=Value(2),
                output_field=IntegerField()
            )
        ).order_by('priority') # 权重越小排序越靠前,可追加其他排序规则如 'name'、'-id' 等

上述代码通过annotate方法给每条匹配的记录动态生成优先级字段,所有者用户名匹配的记录优先级更高(数值更小),直接在数据库层面完成排序,全程仅发起一次SQL查询,返回结果为原生QuerySet对象,完全兼容DRF的分页逻辑,不会出现分页失效问题。

测试验证:
以示例测试数据、搜索关键词为test的场景为例,返回结果顺序和预期完全一致:

  1. 所有者用户名为test的id=2记录(优先级1)排在最前
  2. 房间名匹配的id=1、id=3记录(优先级2)紧随其后
    如果需要同优先级下的次级排序,比如房间名匹配的记录按名称字典序排序,只需要修改order_by为.order_by('priority', 'name')即可。

内容的提问来源于stack exchange,提问作者Matvii Kurdiukov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 19:54:01