20、Django_rest framework_View类再次

2019-12-15  本文已影响0人  猪儿打滚
痛点

经过之前的过滤引擎、分页引擎的学习后,会发现view视图的代码越来越多,复用和维护又变得困难了。本次就想方法来解决这个痛点

一、回顾views.py中,关于project的代码
1.1、5个方法,分为了两个类来写的原因
urlpatterns = [
    path('projects/', views.ProjectsList.as_view()),
    path('projects/<int:pk>/', views.ProjectDetail())
]
二、 rest_framework.mixins
2.1、rest_framework.mixins的几个方法中的代码实现逻辑,分别上面之前实现的方法的代码实现逻辑一样
2.2、查看rest_framework的源码,会发现mixins.ListModelMixin类的代码和之前使用的获取所有projecet信息的get方法一样:
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)
2.3、优化之前views.py中关于project的代码
from projects.models import Projects
from projects.serializer import ProjectModelSerializer
from rest_framework.generics import GenericAPIView
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import mixins

## 注意先继承mixins的方法
class ProjectsList(mixins.ListModelMixin,
                   mixins.CreateModelMixin,
                   GenericAPIView):
    ordering_fields = ['name', 'leader']
    queryset =Projects.objects.all()
    serializer_class = ProjectModelSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['name', 'desc']

    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 ProjectDetail(mixins.RetrieveModelMixin,
                    mixins.UpdateModelMixin,
                    mixins.DestroyModelMixin,
                    GenericAPIView):

    queryset = Projects.objects.all()
    serializer_class = ProjectModelSerializer    
    def get(self, request, *args,**kwargs):
        return self.retrieve(request, *args, **kwargs)
    def put(self, request, *args,**kwargs):
        return self.update(request, *args, **kwargs)
    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)
上一篇 下一篇

猜你喜欢

热点阅读