GenericAPIView

'''
class GenericAPIView(views.APIView):
    ...
    filter_backends = api_settings.DEFAULT_FILTER_BACKENDS
    
    pagination_class = api_settings.DEFAULT_PAGINATION_CLASS
    
	...
    def filter_queryset(self, queryset):
        for backend in list(self.filter_backends):
            queryset = backend().filter_queryset(self.request, queryset, self)
        return queryset

    @property
    def paginator(self):
        if not hasattr(self, '_paginator'):
            if self.pagination_class is None:
                self._paginator = None
            else:
                self._paginator = self.pagination_class()
        return self._paginator

    def paginate_queryset(self, queryset):
        if self.paginator is None:
            return None
        return self.paginator.paginate_queryset(queryset, self.request, view=self)

    def get_paginated_response(self, data):
        assert self.paginator is not None
        return self.paginator.get_paginated_response(data)
'''

drf内置的基础分页器和偏移分页器的使用

'''
# ...\luffyapi\luffyapi\apps\course\views.py
from rest_framework.viewsets import ReadOnlyModelViewSet
from . import models, course_serializers, course_pagination


class FreeCourseReadOnlyModelViewSet(ReadOnlyModelViewSet):
    ...
    # pagination_class = course_pagination.CourseLimitOffsetPagination
    pagination_class = course_pagination.CoursePageNumberPagination  # 使用分页器后, 前端获取数据的方式为response.data.results
    

# ...\luffyapi\luffyapi\apps\course\course_pagination.py
from rest_framework import pagination
# 基础分页
class CoursePageNumberPagination(pagination.PageNumberPagination):
    page_size = 10  # 设置一页显示的条数
    page_query_param = 'page'  # 用户可以通过关键字page查询指定页码的数据
    page_size_query_param = 'page_size'  # 用户可以通过关键字page_size对一页显示的条数进行更改
    max_page_size = 10  # 设置一页最大可以显示的条数


# 偏移分页
class CourseLimitOffsetPagination(pagination.LimitOffsetPagination):
    default_limit = 10  # 设置一页显示的条数
    limit_query_param = 'limit'  # 用户可以通过关键字limit对一页显示的条数进行更改
    offset_query_param = 'offset'  # 用户可以通过关键字offset指定一页数据显示的起始位置
    max_limit = 10  # 设置一页最大可以显示的条数
'''

过滤器

drf内置搜索过滤器和排序过滤器的使用

'''
# ...\luffyapi\luffyapi\apps\course\views.py
from rest_framework.viewsets import ReadOnlyModelViewSet
...
from rest_framework import filters


class FreeCourseReadOnlyModelViewSet(ReadOnlyModelViewSet):
    ...
    filter_backends = [filters.SearchFilter, filters.OrderingFilter]
    
    # 只能使用数据库字段
    search_fields = ['name']  # http://127.0.0.1:8000/course/free/?search=python, 数据量大时需要建index索引
    ordering_fields = ['price', 'id', 'students']  # http://127.0.0.1:8000/course/free/?ordering=-price
'''

django-filter插件实现区间分类

安装: pip install django-filter

'''
# D:\PythonVirtualEnvironment\luffyapi\Lib\site-packages\django_filters\rest_framework\backends.py
from . import ..., filterset
...


class DjangoFilterBackend(metaclass=RenameAttributes):
    filterset_base = filterset.FilterSet
	
	...
    def get_filterset_class(self, view, queryset=None):
        ...
        if filterset_class is None and hasattr(view, 'filter_class'):
            ...
            filterset_class = getattr(view, 'filter_class', None)
            
        ...
        if filterset_fields and queryset is not None:
            MetaBase = getattr(self.filterset_base, 'Meta', object)

            class AutoFilterSet(self.filterset_base):
                class Meta(MetaBase):
                    model = queryset.model
                    fields = filterset_fields

            return AutoFilterSet

        return None


# ...\luffyapi\luffyapi\apps\course\views.py
from rest_framework.viewsets import ReadOnlyModelViewSet
...
from . import models, course_filterset
from django_filters.rest_framework import DjangoFilterBackend


class FreeCourseReadOnlyModelViewSet(ReadOnlyModelViewSet):
    ...
    filter_backends = [DjangoFilterBackend, ]

    filter_class = course_filterset.CourseFilterSet
    

# ...\luffyapi\luffyapi\apps\course\course_filterset.py
from django_filters.rest_framework.filterset import FilterSet
from django_filters import filters
from . import models


class CourseFilterSet(FilterSet):
    # 自定义过滤区间
    min_price = filters.NumberFilter(field_name='price', lookup_expr='gte')  # http://127.0.0.1:8000/course/free/?min_price=99
    max_price = filters.NumberFilter(field_name='price', lookup_expr='lte')  # 区间一般为数字区间, 使用NumberFilter类即可

    class Meta:
        model = models.Course
        fields = ['course_category']  # 定义分组字段, http://127.0.0.1:8000/course/free/?course_category=1
'''

自定义过滤器

'''
class MyFilter:
    def filter_queryset(self, request, queryset, view):
        ...
            return queryset
'''

前端视频播放与后端视频托管

前端详情页视频播放需要先安装插件: cnpm install vue-video-player

七牛云视频托管