zoukankan      html  css  js  c++  java
  • drf框架

    1.drf偏移分页组件

    2.drf游标分页组件(了解)

    3.自定义过滤器

    4.过滤器插件(django-filter)

    一.drf偏移分页组件

    api/pahenations.py

    from rest_framework.pagination import LimitOffsetPagination
    class MyLimitOffsetPagination(LimitOffsetPagination):
            # ?offset=从头偏移的条数&limit=要显示的条数
            limit_query_param = 'limit'
            offset_query_param = 'offset'
            
            # ?不传offset和limit默认显示前3条,只设置offset就是从偏移位往后再显示3条
            default_limit = 3
            
            # ?limit可以自定义一页显示的最大条数
            max_limit = 5
            
            # 只使用limit结合ordering可以实现排行前几或者后几
            # ?ordering=- price&limit=2  => 价格前2

    views.py

    from rest_framework.generics import ListAPIView
    
    class CarListAPIView(ListAPIView):
            # 如果queryset没有过滤条件,就必须 .all(),不然分页会出问题
            queryset = models.Car.objects.all()
            serializer_class = serializers.CarModelSerializer
        
            # 分页组件 - 给视图类配置分页即可 - 分页类需要自定义,继承drf提供的分页类即可
            pagination_class = pagenations.MyLimitOffsetPagination

    二.drf游标分页组件(了解)

    api/pahenations,py

    # 注:必须基于排序规则下进行分页
    # 1.如果接口配置了OrderingFilter过滤器,那么url中必须传ordering
    # 2.如果接口没有配置OrderingFilter过滤器,一定要在分页类中声明ordering按照某个字段进行默认的排序
    
    from rest_framework.pagination import CursorPagination
    class MyCursorPagination(CursorPagination):
        cursor_query_param = 'cursor'
        page_size = 3
        page_size_query_param = 'page_size'
        max_page_size = 5
        ordering = '-pk'

    views,py

    from rest_framework.generics import ListAPIView
    
    class CarListAPIView(ListAPIView):
        # 如果queryset没有过滤条件,就必须 .all(),不然分页会出问题
        queryset = models.Car.objects.all()
        serializer_class = serializers.CarModelSerializer
        
        # 分页组件 - 给视图类配置分页类即可 - 分页类需要自定义,继承drf提供的分页类即可
        pagination_class = pagenations.MyCursorPagination

    三.自定义过滤器

    api/filters.py

    # 自定义过滤器,接口:?limit=显示的条数
    class LimitFilter:
           def filter_queryset(self,request,queryset,view):
                # 前台固定用 ?limit=... 传递过滤参数
                # query_params拿到的是浏览器url后面什么等于什么的条件参数
                limit = request.query_params.get('limit')
                if limit:    
                    limit = int(limit)    
                    return queryset[:limit]
                return queryset

    views.py

    from rest_framework.generics import ListAPIView
    
    class CarListAPIView(ListAPIView):
        # 如果queryset没有过滤条件,就必须 .all(),不然分页会出问题
        queryset = models.Car.objects.all()
        serializer_class = serializers.CarModelSerializer
        
        # 局部配置 过滤类 们(全局配置用DEFAULT_FILTER_BACKENDS)
        filter_backends = [LimitFilter]

    四.过滤器插件(django-filter)

    安装

    pip3 install django-filter

    过滤条件层:自定义api/filters.py

    # django-filter插件过滤器类
    from django_filters.rest_framework.filterset import FilterSet
    from . import models
    
    # 自定义过滤字段
    from django_filters import filters
    class CarFilterSet(FilterSet):
        min_price = filters.NumberFilter(field_name='price', lookup_expr='gte')
        max_price = filters.NumberFilter(field_name='price', lookup_expr='lte')
        class Meta:
            model = models.Car
            fields = ['brand', 'min_price', 'max_price']
            # brand是model中存在的字段,一般都是可以用于分组的字段
            # min_price、max_price是自定义字段,需要自己自定义过滤条件

    views.py

    # django-filter插件过滤器
    from django_filters.rest_framework import DjangoFilterBackend
    from .filters import CarFilterSet
    
    class CarListAPIView(ListAPIView):
        queryset = models.Car.objects.all()
        serializer_class = serializers.CarModelSerializer
        
        # 局部配置 过滤类 们(全局配置用DEFAULT_FILTER_BACKENDS)
        filter_backends = [DjangoFilterBackend]
        
        # django-filter过滤器插件使用
        filter_class = CarFilterSet
        # 接口:?brand=...&min_price=...&max_price=...
        # eg:?brand=宝马&min_price=5&max_price=10 => 5~10间的宝马牌汽车
  • 相关阅读:
    阿里巴巴java开发手册学习
    策略模式
    windows常用技巧
    nginx学习
    Tomcat入门
    ThreadPoolTaskExecutor的简单使用
    linux服务器测试性能
    HAProxy1.5.x tcp example
    Haproxy开启日志
    Fix rpmdb: Thread died in Berkeley DB library
  • 原文地址:https://www.cnblogs.com/zahngyu/p/11734513.html
Copyright © 2011-2022 走看看