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

