文章目录
一、排序
默认情况下,查询参数被命名为 ,但该参数可能会被该设置覆盖。
例如,要按用户名对用户进行排序:
http://example.com/api/users?ordering=username
客户端还可以通过在字段名称前面加上“-”来指定反向排序,如下所示:
http://example.com/api/users?ordering=-username
还可以指定多个顺序:
http://example.com/api/users?ordering=account,username
1.指定哪些字段可以排序
在排序筛选器中显式指定 API 应允许的字段。您可以通过在视图上设置属性来执行此操作,如下所示:
class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = [filters.OrderingFilter]
ordering_fields = ['username', 'email']
2.所有字段都可排序
这有助于防止意外的数据泄露,例如允许用户针对密码哈希字段或其他敏感数据进行排序。
如果未在视图上指定属性,则筛选器类将默认允许用户筛选该属性指定的序列化程序上的任何可读字段。
如果您确信视图使用的查询集不包含任何敏感数据,则还可以使用特殊值 显式指定视图应允许对任何模型字段或查询集聚合进行排序。
class BookingsListView(generics.ListAPIView):
queryset = Booking.objects.all()
serializer_class = BookingSerializer
filter_backends = [filters.OrderingFilter]
ordering_fields = '__all__'
3.默认排序
如果在视图上设置了属性,则此属性将用作默认排序。
通常,您可以通过在初始查询集上进行设置来控制此设置,但是使用视图上的参数可以指定顺序,然后可以将其作为上下文自动传递到呈现的模板。这样,如果使用列标题对结果进行排序,则可以自动以不同的方式呈现列标题。
class UserListView(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = [filters.OrderingFilter]
ordering_fields = ['username', 'email']
ordering = ['username']
该属性可以是字符串,也可以是字符串的列表/元组。