GenericAPIView、間隔分類を達成するためのdrfの組み込み基本ページャーとオフセットページャー、フィルター、django-filterプラグインの使用

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

7 Niuyunビデオホスティング

おすすめ

転載: www.cnblogs.com/-406454833/p/12709341.html