drf 过滤器分页器

分页器:可以使用的类
        PageNumberPagination:将页码拼接在url后面 GET https://api.example.org/accounts/?page=4
        LimitOffsetPagination:利用偏移量和数据条数取 GET https://api.example.org/accounts/?limit=100&offset=400

        自定义分类器继承已有的,加以修改:
            # 自定义分页器
            class MoviePagination(PageNumberPagination):
                # 每页数量
                page_size = 5
                # 请求时将page改名为p
                page_query_param = 'p'
                # 最大可请求页数
                max_page_size = 20
    配置:全局配置:在settings里
            REST_FRAMEWORK = {
                'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
                'PAGE_SIZE': 100
                            }
         局部配置:添加在类视图cbv上
                    class MovieListViewSet(ListModelMixin, GenericViewSet):

                        queryset = Movie.objects.all()
                        serializer_class = MovieListSerializer

                        # 添加分页
                        pagination_class = LimitOffsetPagination

                        # 局部添加定制身份权限认证
                        # 设置需要身份验证的类
                        authentication_classes = [BasicAuthentication, SessionAuthentication, JWTAuthentication]
                        # 全类权限认证
                        permission_classes = [IsAuthenticated, ]
过滤器筛选:
    API:
        安装:pip install django-filter
            将'django_filters',添加到应用
        1.DjangoFilterBackend:
            from django_filters.rest_framework import DjangoFilterBackend
            全局设置在settings里
            REST_FRAMEWORK = {
                                'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
                            }
            局部设置:
                # 过滤器可多个
                filter_backends = [DjangoFilterBackend, SearchFilter]

                # Backend过滤字段设置
                filterset_fields = ['total', 'number']
        2.SearchFilter:
            from rest_framework.filters import SearchFilter
            # 过滤器可多个
            filter_backends = [SearchFilter,]

            # 搜索过滤字段设置
            search_fields = ['showname', ]

          还可以使用查找 API 双下划线表示法对 ForeignKey 或 ManyToManyField 执行相关查找:
            search_fields = ['username', 'email', 'profile__profession']

          搜索行为可以通过在 search_fields.
            '^' 以搜索开始。
            '=' 完全匹配。
            '@' 全文搜索。 (目前只支持 Django 的 PostgreSQL 后端 。)
            '$' 正则表达式搜索。
            例如:
                search_fields = ['=username', '=email']
        3.OrderingFilter:字段排序
            from rest_framework.filters import OrderingFilter
            # 过滤器可多个
            filter_backends = [DjangoFilterBackend, SearchFilter, OrderingFilter]
            # 排序字段设置
            ordering_fields = ['number', 'total']
        4.自定义过滤器
            在应用里建一个filter.py文件写入
            class OrderFilter(FilterSet):
                # 设置过滤字段及条件,默认为相等匹配
                totalmax = django_filters.NumberFilter(field_name='total', lookup_expr='gte')
                totalmin = django_filters.NumberFilter(field_name='total', lookup_expr='lte')

                movie_id = django_filters.NumberFilter(field_name='movie_id')

                # 自定义过滤,条件不符合执行另一个
                def movie_id_filter(self, queryset, name, value):
                    result = queryset.filter(Q(movie_id=value) | Q(user__order__movie_id=value))
                    return result

                class Meta:
                    model = Order
                    fields = ['total', ]

API接口
    过程:写serializers.py
        写view.py

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值