rest_framework--过滤器filters--排序

rest_framework–过滤器filters–排序

  • view

    from rest_framework.pagination import PageNumberPagination
    from rest_framework import mixins
    from rest_framework import viewsets
    from rest_framework import filters
    
    
    from .models import Goods
    from .serializers import GoodsSerializer
    
    
    class GoodsPagination(PageNumberPagination):
        page_size = 10
        page_size_query_param = "page_size"
        page_query_param = "p"
        max_page_size = 100
    
    
    class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
        # 指定queryset
        queryset = Goods.objects.all()
    
        # 指定序列化类
        serializer_class = GoodsSerializer
    
        # 指定分页类
        pagination_class = GoodsPagination
    
        # 添加过滤器 这里可以吧django-filter过滤器添加进来 和 rest_framework的filters添加进来一起用, 也可以单个用, 看你的需求
        filter_backends = [filters.OrderingFilter]
    
        # 指定排序的字段
        ordering_fields = ["sold_num", "add_time"]
    
  • settings

    INSTALLED_APPS = [
        'rest_framework',
    ]
    
  • url

    from django.conf.urls import url, include
    
    from rest_framework.routers import DefaultRouter
    
    from goods.views import GoodsListViewSet
    # 生成一个注册器实例对象
    router = DefaultRouter()
    # 将需要自动生成url的接口注册
    # 配置goods的url
    router.register(r'goods', GoodsListViewSet, base_name="goods-list")
    
    urlpatterns = [
        # 自动生成url
        url(r"^", include(router.urls)),
    ]
    
    
  • 效果图
    在这里插入图片描述

  • 官方说明

    OrderingFilter

    OrderingFilter类支持控制结果的排序简单的查询参数。

    [外链图片转存失败(img-T2E3KVKc-1568465253377)(https://www.django-rest-framework.org/img/ordering-filter.png)]

    默认情况下,查询参数已命名'ordering',但这可能会被ORDERING_PARAM设置覆盖。

    例如,要按用户名订购用户:

    http://example.com/api/users?ordering=username
    

    客户端还可以通过在字段名称前加上“ - ”来指定反向排序,如下所示:

    http://example.com/api/users?ordering=-username
    

    还可以指定多个排序:

    http://example.com/api/users?ordering=account,username
    

    指定可以针对哪些字段进行排序

    建议您明确指定API在排序过滤器中应允许的字段。您可以通过ordering_fields在视图上设置属性来执行此操作,如下所示:

    class UserListView(generics.ListAPIView):
        queryset = User.objects.all()
        serializer_class = UserSerializer
        filter_backends = [filters.OrderingFilter]
        ordering_fields = ['username', 'email']
    

    这有助于防止意外数据泄漏,例如允许用户针对密码哈希字段或其他敏感数据进行排序。

    如果ordering_fields在视图上指定属性,则筛选器类将默认允许用户筛选serializer_class属性指定的序列化程序上的任何可读字段。

    如果您确信视图使用的查询集不包含任何敏感数据,则还可以使用特殊值明确指定视图应允许对任何模型字段或查询集合进行排序'__all__'

    class BookingsListView(generics.ListAPIView):
        queryset = Booking.objects.all()
        serializer_class = BookingSerializer
        filter_backends = [filters.OrderingFilter]
        ordering_fields = '__all__'
    

    指定默认排序

    如果ordering在视图上设置了属性,则将其用作默认排序。

    通常,您可以通过设置order_by初始查询集来控制它,但是使用ordering视图上的参数允许您以一种方式指定排序,然后它可以作为上下文自动传递给渲染模板。这样,如果用于排序结果,则可以自动呈现列标题。

    class UserListView(generics.ListAPIView):
        queryset = User.objects.all()
        serializer_class = UserSerializer
        filter_backends = [filters.OrderingFilter]
        ordering_fields = ['username', 'email']
        ordering = ['username']
    

    ordering属性可以是字符串或字符串的列表/元组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只因为你温柔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值