关于类视图选择继承APIView还是工具视图(ListAPIView、CreateAPIView等等)

APIView使用方法,直接继承APIView,get或者post请求。方法很简单1.先获取到要操作的数据,然后把数据放到serializer中序列化或者反序列化,最后return返回值(记得.data

1.第一个例子

 2.第二个例子

 主要流程:获取到数据对象,然后传入到serializer中校验,最后response返回前端数据(注意返回的数据要.data)

工具视图(ListAPIView,CreataAPIView等)

https://www.cnblogs.com/wangcuican/p/11710450.html 工具视图学习资料

我们要知道上面这些工具视图是继承GenericAPIView和Mixins各种工具类的

GenericAPIView

我们要先了解GenericAPIView的用法(比如下面的)(******)

先写GenericAPIView的两个属性:queryset(指明视图需要的数据,这个主要是针对从数据库中获取数据,如果是从前端获取数据就不用写queryset了,数据就从reqeust中获取)和serializer_class指明视图使用哪个序列化器

如果你写了上面的两个属性,就必须需要使用get_queryset和get_serializer进行操作(特别需要注意******)

get_queryset功能:从类属性queryset中获取model的queryset数据

get_serializer功能:从类属性serializer_class中获得serializer的序列化类,主要是给Mixin扩展类使用

from rest_framework.generics import GenericAPIView
class BookGenericAPIView(GenericAPIView):
    queryset = models.Book.objects.filter(is_delete=False)
    serializer_class = serializers.BookModelSerializer
    # 自定义主键的 有名分组 名
    lookup_field = 'pk'    #先定义好,单取可以使用
    # 群取
    def get(self, request, *args, **kwargs):
        book_query = self.get_queryset()  #获取queryset数据(model查询数据)
        book_ser = self.get_serializer(book_query, many=True)  #我的理解是数据被[]嵌套就要写many=True(book_query查出来是queryset类型,如果查出来是object就不用写many=True)
        book_data = book_ser.data   #返回前台的数据必须需要.data,才能返回(******)
        return APIResponse(results=book_data)

    # 单取
    def get(self, request, *args, **kwargs):
        book_query = self.get_object()
        book_ser = self.get_serializer(book_query)
        book_data = book_ser.data
        return APIResponse(results=book_data)

Mixins各种工具类(配合GenericAPIView一起使用

mixins有五个工具类文件,一共提供了五个工具类,六个工具方法:单查、群查、单增、单删、单整体改、单局部改
五个工具类CreateModelMixin(增加),DestroyModelMixin(删除),ListModelMixin(查询,查queryset),RetrieveModelMixin(查询,查对象,针对于存在"pk"),UpdateModelMixin(修改)

举例子

现在我们就有疑问了,前面说了用GenericAPIView,就必须要get_queryset()和serializer_class()。这里Mixins工具类也使用了GenericAPIView为什么没见这两个方法。

get_queryset()和serializer_class()这两个方法在list,create等源码方法中

源码:(针对增加数据的源码create)这里面用到了get_serializer,所以我们在这之前就必须设定一个serializer_class方法。

 举例子:Create增加的用法(这里我们直接用CreateAPIView方法,在源码中已经继承GenericAPIView和Mixin工具类。就不用再去自定义类,然后继承GenericAPIView和Mixin工具类这种麻烦的操作

from rest_framework.generics import CreateAPIView
class RegisterCreateAPIView(CreateAPIView):
    serializer_class = serializers.RegisterModelSerializer    

    #重写create方法,CreateModelMixin中的create方法,下面这段代码是到create源码中粘贴过来的(******)
    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data) 
        serializer.is_valid(raise_exception=True)  # 校验失败就主动抛异常 => 自定义异常结果,配置异常模块
        user_obj = serializer.save()  # 要自定义入库逻辑,重写serializer中的create方法
        headers = self.get_success_headers(serializer.data)
        # 响应结果需要格式化,使用序列化类要提供序列化与反序列化两套规则
     #返回前端的数据APIResponse
return APIResponse(0, 'ok', results=serializers.RegisterModelSerializer(user_obj).data, http_status=201, headers=headers )

这里我们为什么要重写create方法呢,因为想自定义返回值APIResponse,如果你不需要重写方法,那么这个类下面只写queryset和serializer_class这两个属性就行了。

原文地址:https://www.cnblogs.com/wangcuican/p/11894547.html