【愚公系列】2022年04月 Python教学课程 75-DRF框架之排序

举报
愚公搬代码 发表于 2022/04/21 01:35:17 2022/04/21
【摘要】 一、排序默认情况下,查询参数被命名为 ,但该参数可能会被该设置覆盖。例如,要按用户名对用户进行排序:http://example.com/api/users?ordering=username客户端还可以通过在字段名称前面加上“-”来指定反向排序,如下所示:http://example.com/api/users?ordering=-username还可以指定多个顺序:http://exa...

一、排序

默认情况下,查询参数被命名为 ,但该参数可能会被该设置覆盖。

例如,要按用户名对用户进行排序:

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']

该属性可以是字符串,也可以是字符串的列表/元组。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。