欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

rest_framework--过滤器filters--排序

程序员文章站 2022-05-23 08:35:35
...

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)),
    ]
    
    
  • 效果图
    rest_framework--过滤器filters--排序

  • 官方说明

    OrderingFilter

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

    rest_framework--过滤器filters--排序

    默认情况下,查询参数已命名'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属性可以是字符串或字符串的列表/元组。

相关标签: 排序