美文网首页
21、Django_rest framework_Concret

21、Django_rest framework_Concret

作者: 猪儿打滚 | 来源:发表于2020-03-08 17:20 被阅读0次

在上一章优化了的基础上,再次优化

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)

一、generics/Concrete Generic Views

从该文件的类方法源码,可以看到这些方法都继承了mixinsGenericAPIView类,并实现了和上面的get/post等方法的组合的方法
比如rest_framework.generics.ListCreateAPIView

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)
generics/Concrete Generic Views中的类,可以根据自己的需要来继承这些类
  • RetrieveAPIView
    1.提供get方法
    2.继承:RetrieveModelMixinGenericAPIView
  • UpdateAPIView
    1.提供putpatch方法
    2.继承:UpdateModelMixinGenericAPIView
  • DestroyAPIView
    1.提供delete方法
    2.继承:DestoryModelMixinGenericAPIView
  • ListAPIView
    1.提供get方法
    2.继承:ListModelMixinGenericAPIView
  • CreateAPIView
    1.提供post方法
    2.继承:CreateModelMixinGenericAPIView
  • ListCreateAPIView
    1.提供postget方法
    2.继承:ListModelMixinCreateModelMixinGenericAPIView
  • RetrieveUpdateAPIView
    1.提供getdelete方法
    2.继承:RetrieveModelMixinDestoryModelMixinGenericAPIView
  • RetrieveUpdateDestoryAPIView
    1.提供getputdelete方法
    2.继承:RetrieveModelMixinUpdateModelMixinDestoryModelMixinGenericAPIView

所以,可以直接继承generics中满足所需的方法,并可优化成:

from projects.models import Projects
from projects.serializer import ProjectModelSerializer
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import generics
class ProjectsList(generics.ListCreateAPIView):
    ordering_fields = ['name', 'leader']
    queryset = Projects.objects.all()
    serializer_class = ProjectModelSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['name', 'leader', 'tester']
class ProjectDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Projects.objects.all()
    serializer_class = ProjectModelSerializer
generics/Concrete Generic Views的痛点
  • 上面的代码中,还是有两个类视图,还不能合并
  • 两个类视图中,有相同的get方法,会冲突
  • 两个类视图所对应的url地址依旧不一致

相关文章

网友评论

      本文标题:21、Django_rest framework_Concret

      本文链接:https://www.haomeiwen.com/subject/ooalzctx.html