手摸手,带你用Django REST Framework撸接口系列十(排序篇)
排序这篇文章其实应该是要挂在过滤篇的,因为对某个字段进行排序其实也是一种过滤的方式,只是过滤出来的还是返回一个model的全部queryset,在使用上也和过滤器没什么区别,我们就接着上篇过滤器来讲。
Django REST Framework系列文章
- 手摸手,带你用Django REST Framework撸接口系列一(基础篇)
- 手摸手,带你用Django REST Framework撸接口系列二(序列化器篇)
- 手摸手,带你用Django REST Framework撸接口系列三(视图篇)
- 手摸手,带你用Django REST Framework撸接口系列四(渲染器篇)
- 手摸手,带你用Django REST Framework撸接口系列五(路由篇)
- 手摸手,带你用Django REST Framework撸接口系列六(认证篇)
- 手摸手,带你用Django REST Framework撸接口系列七(权限篇)
- 手摸手,带你用Django REST Framework撸接口系列八(限流篇)
- 手摸手,带你用Django REST Framework撸接口系列九(过滤篇)
- 手摸手,带你用Django REST Framework撸接口系列十(排序篇)
- 手摸手,带你用Django REST Framework撸接口系列十一(分页篇)
- 手摸手,带你用Django REST Framework撸接口系列十二(异常处理篇)
- 手摸手,带你用Django REST Framework撸接口系列十三(自动生成接口文档篇)
使用OrderingFilter
类首先要把它加入到filter_backends
, 然后指定排序字段即可。默认情况下,查询参数名为'ordering'
,但这可以通过settings配置restframe中使用ORDERING_PARAM
设置覆盖。
1 | from rest_framework.filters import OrderingFilter |
发送请求时只需要在参数上加上?ordering=id或者?ordering=created_time即可实现对结果按文章创建时间正序和逆序进行排序。
点击DRF界面上的Filters按钮,你还会看到搜索和排序的选项,如果你不指定允许排序的字段的话,默认支持所有字段排序。
指定支持排序的字段
建议你明确指定API应在ordering filter中允许哪些字段。您可以通过在view中设置ordering_fields
属性来实现这一点,如下所示:
1 | from rest_framework.filters import OrderingFilter |
这有助于防止意外的数据泄漏,例如允许用户针对密码哈希字段或其他敏感数据进行排序。
如果不在视图上指定ordering_fields
属性,过滤器类将默认允许用户对serializer_class
属性指定的serializer上的任何可读字段进行过滤。
如果你确信视图正在使用的queryset不包含任何敏感数据,则还可以通过使用特殊值'__all__'
来明确指定view应允许对任何model字段或queryset进行排序。
1 | from rest_framework.filters import OrderingFilter |
指定默认排序
如果在view中设置了ordering
属性,则将把它用作默认排序。
通常,你可以通过在初始queryset上设置order_by
来控制此操作,但是使用view中的ordering
参数允许你以某种方式指定排序,然后可以将其作为上下文自动传递到呈现的模板。如果它们用于排序结果的话就能使自动渲染不同的列标题成为可能。
1 | from rest_framework.filters import OrderingFilter |
ordering
属性可以是字符串或字符串的列表/元组。
小结
实际开发应用中OrderingFilter类,SearchFilter类和DjangoFilterBackend经常一起联用作为DRF的filter_backends
,没有相互冲突。
Django REST Framework系列文章
- 手摸手,带你用Django REST Framework撸接口系列一(基础篇)
- 手摸手,带你用Django REST Framework撸接口系列二(序列化器篇)
- 手摸手,带你用Django REST Framework撸接口系列三(视图篇)
- 手摸手,带你用Django REST Framework撸接口系列四(渲染器篇)
- 手摸手,带你用Django REST Framework撸接口系列五(路由篇)
- 手摸手,带你用Django REST Framework撸接口系列六(认证篇)
- 手摸手,带你用Django REST Framework撸接口系列七(权限篇)
- 手摸手,带你用Django REST Framework撸接口系列八(限流篇)
- 手摸手,带你用Django REST Framework撸接口系列九(过滤篇)
- 手摸手,带你用Django REST Framework撸接口系列十(排序篇)
- 手摸手,带你用Django REST Framework撸接口系列十一(分页篇)
- 手摸手,带你用Django REST Framework撸接口系列十二(异常处理篇)
- 手摸手,带你用Django REST Framework撸接口系列十三(自动生成接口文档篇)