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

如何在Django OrderFilter中将默认排序从ASC改为DESC

Django视图集默认排序不生效的解决办法

你遇到的问题是视图集的ordering默认字段未生效,这里有两个简单可行的解决方案:

方法一:直接在查询集里指定默认排序

这是最直接的方式,给queryset加上order_by('-created_at'),默认返回的内容就会按创建时间降序排列,同时保留ordering_fields让用户可以通过URL参数手动修改排序规则:

class ContentViewSet(viewsets.ModelViewSet):
    queryset = Content.objects.all().order_by('-created_at')
    serializer_class = ContentSerializer
    filter_backends = [OrderingFilter]
    ordering_fields = ['created_at']

方法二:手动控制默认排序逻辑

如果不想修改原始查询集,可以重写get_queryset方法,仅当URL没有传入ordering参数时,应用默认的降序排序:

class ContentViewSet(viewsets.ModelViewSet):
    queryset = Content.objects.all()
    serializer_class = ContentSerializer
    filter_backends = [OrderingFilter]
    ordering_fields = ['created_at']

    def get_queryset(self):
        queryset = super().get_queryset()
        # 无排序参数时,默认按created_at降序排列
        if 'ordering' not in self.request.query_params:
            queryset = queryset.order_by('-created_at')
        return queryset

推荐优先用第一种方法,它符合DRF的常规用法,代码更简洁直观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 02:33:34