Django中DRF框架进行视图类的通用视图、Mixin拓展类、ViewSet视图集

进行通用视图的使用,其中每个继承类中包含多个action方法

# a.python中支持多重继承,一个类可以同时继承多个父类
# b.类中的方法和属性是按照__mro__所指定的继承顺序进行搜索
ListCreateAPIView类中包含了list和create方法
from django.http import JsonResponse
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework.generics import GenericAPIView
from rest_framework import status
from rest_framework import filters
from rest_framework import mixins
from rest_framework import generics
from rest_framework import viewsets

from .models import Projects
from .serializers import ProjectSerilizer, ProjectModelSerializer
from utils.pagination import PageNumberPagination

 class ProjectsView(generics.ListCreateAPIView):

    queryset = Projects.objects.all()
    serializer_class = ProjectModelSerializer

    filter_backends = [filters.SearchFilter, filters.OrderingFilter]
    search_fields = ['=name', '=leader', '=id']
    ordering_fields = ['id', 'name', 'leader']

    # 可以在类视图中指定分页引擎类,优先级高于全局
    pagination_class = PageNumberPagination
    def get(self, request, *args, **kwargs):

        return self.list(request, *args, **kwargs)

     def post(self, request, *args, **kwargs):

        return self.create(request, *args, **kwargs)
class ListCreateAPIView(mixins.ListModelMixin,
                        mixins.CreateModelMixin,
                        GenericAPIView):
    """
    Concrete view for listing a queryset or creating a model instance.
    """
    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)
class ListModelMixin:
    """
    List a queryset.
    """
    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())

        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)

        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)
class CreateModelMixin:
    """
    Create a model instance.
    """
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

    def perform_create(self, serializer):
        serializer.save()

    def get_success_headers(self, data):
        try:
            return {'Location': str(data[api_settings.URL_FIELD_NAME])}
        except (TypeError, KeyError):
            return {}

可以把多个action进行融合到一起

class ProjectsDetailView(generics.RetrieveUpdateDestroyAPIView):
    queryset = Projects.objects.all()
    serializer_class = ProjectSerilizer

    # def get(self, request, *args, **kwargs):
    #     # instance = self.get_object()
    #     # serializer = self.get_serializer(instance=instance)
    #     # return Response(serializer.data, status=status.HTTP_200_OK)
    #     return self.retrieve(request, *args, **kwargs)
    #
    # def put(self, request, *args, **kwargs):
    #     # instance = self.get_object()
    #     # serializer = self.get_serializer(instance=instance, data=request.data)
    #     # serializer.is_valid(raise_exception=True)
    #     # serializer.save()
    #     # return Response(serializer.data, status=status.HTTP_201_CREATED)
    #     return self.update(request, *args, **kwargs)
    #
    # def delete(self, request, *args, **kwargs):
    #     # instance = self.get_object()
    #     # instance.delete()
    #     # return Response(status=status.HTTP_204_NO_CONTENT)
    #     return self.destroy(request, *args, **kwargs)

进行继承视图集,里面包含了所以的action方法

a.可以继承视图集父类ViewSet
# b.在定义url路由条目时,支持给as_view传递字典参数(请求方法名与具体调用的action方法名的一一对应关系)
# c.ViewSet继承了ViewSetMixin, views.APIView
# d.具备APIView的所有功能
# e.继承ViewSetMixin,所有具备持给as_view传递字典参数(请求方法名与具体调用的action方法名的一一对应关系)
class ProjectViewSet(viewsets.ModelViewSet):
    """
    定义视图集
    """

    # def list(self, request, *args, **kwargs):
    #     pass

    # def retrieve(self, request, *args, **kwargs):
    #     pass

    # def create(self, request, *args, **kwargs):
    #     pass

    # def update(self, request, *args, **kwargs):
    #     pass
    #
    # def partial_update(self, request, *args, **kwargs):
    #     pass
    #
    # def destroy(self, request, *args, **kwargs):
    #     pass

    queryset = Projects.objects.all()
    serializer_class = ProjectSerilizer
class GenericViewSet(ViewSetMixin, generics.GenericAPIView):
    """
    The GenericViewSet class does not provide any actions by default,
    but does include the base set of generic view behavior, such as
    the `get_object` and `get_queryset` methods.
    """
    pass


class ReadOnlyModelViewSet(mixins.RetrieveModelMixin,
                           mixins.ListModelMixin,
                           GenericViewSet):
    """
    A viewset that provides default `list()` and `retrieve()` actions.
    """
    pass


class ModelViewSet(mixins.CreateModelMixin,
                   mixins.RetrieveModelMixin,
                   mixins.UpdateModelMixin,
                   mixins.DestroyModelMixin,
                   mixins.ListModelMixin,
                   GenericViewSet):
    """
    A viewset that provides default `create()`, `retrieve()`, `update()`,
    `partial_update()`, `destroy()` and `list()` actions.
    """
    pass

使用视图集时,需要在子应用的urls.py文件中进行重新配置路由

from django.urls import path

# from projects.views import get_project, create_project, put_project, delete_project
# from projects import views
from . import views

urlpatterns = [
    # path('get/', views.get_project),
    # path('create/', views.create_project),
    # path('put/', views.put_project),
    # path('delete/', views.delete_project),
    # path('a/', views.delete_project)

    # path('projects/', views.projects),
    # 定义类视图的路由条目
    # a.类视图.as_view()
    # path('projects/<int:pk>/', views.ProjectsView.as_view()),
    # path('projects/', views.ProjectsView.as_view()),
    path('projects/', views.ProjectViewSet.as_view({
        'get': 'list',
        'post': 'create'
    })),
    # path('projects/<int:pk>/', views.ProjectsDetailView.as_view()),
    path('projects/<int:pk>/', views.ProjectViewSet.as_view({
        'get': 'retrieve',
        'put': 'update',
        'patch': 'partial_update',
        'delete': 'destroy'
    })),
]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值