Loading

11.mixins混合类

 
一、混合类(mixins)
使用基于类的视图,最大的优势之一就创建可复用的代码
我们编写的非常类似的代码,可以抽象出来,将这部分代码放到mixin类系列中,然后作为父类提供子类继承使用
from rest_framework import mixins # 导入

 

 

二、使用mixins
from rest_framework import mixins # 导入mixins类
from rest_framework import generics # 导入generics类

# 定义类视图 继承需要使用的mixnis类的方法
# 继承generics.GenericAPIView 视图方法
class SnippetList(mixins.ListModelMixin, mixins.CreateModelMixin, generics.GenericAPIView):
    queryset = Snippet.objects.all()  # 指定要查询的集合
    serializer_class = SnippetSerizlizer  # 指定要使用的序列化器
    #queryset 和 serializer_class 是继承的generics.GenericAPIView的类属性

    # 定义get方法
    def get(self, request, *args, **kwargs):
        # 使用ListModelMixin 的list方法 将数据自动转换格式处理返回
        return self.list(request, *args, **kwargs)

    # 定义post方法
    def post(self, request, *args, **kwargs):
        # 使用CreateModelMixin的create方法
        return self.create(request, *args, **kwargs)


class SnippetListDetail(mixins.RetrieveModelMixin, mixins.UpdateModelMixin, mixins.DestroyModelMixin,generics.GenericAPIView):
    queryset = Snippet.objects.all()  # 指定要查询的集合
    serializer_class = SnippetSerizlizer

    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.delete(request, *args, **kwargs)
三、使用通用的基于类的视图
通过使用mixin类,我们使用更少的代码重写了这些视图,但我们还可以再进一步,rest框架提供了一组已经混合好的(mixed-in)通用视图
类,我们可以使用它来简化我们的views.py
只需要继承generics模块中的现成的某个通用类视图,比如ListCreateAPIView,然后在类里定义queryset和serializer_class两个属性的值
# 继承generics.ListCreateAPIView
class SnippetList(generics.ListCreateAPIView):
    # 定义queryset和serializer_class两个属性的值
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerizlizer
    
# 继承generics.RetrieveUpdateDestroyAPIView
class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerizlizer
    
'''
generics.ListCreateAPIView 源码继承了mixins.ListModelMixin,mixins.CreateModelMixin,GenericAPIView,封装了get和post方法


generics.RetrieveUpdateDestroyAPIView 源码继承了mixins.RetrieveModelMixin,mixins.UpdateModelMixin,mixins.DestroyModelMixin,GenericAPIView,封装了 get、put、delete、patch方法


所以我们只需要继承对应的类,然后定义queryset和serializer_class两个属性的值,剩下交给drf完成
'''

 

 
posted @ 2022-04-29 19:31  木子七  阅读(58)  评论(0编辑  收藏  举报