DRF之视图组件 三次封装

1、为什么要进行封装  

  1.1 在处理表的时候,如果有几十张表都需要增删改查查时,如果每一张表都写这些方法,会让代码显得冗余,所以需要将这些方法进行封装,然后不同的表都去继承这写方法。(这是思路)

  1.2 分析需要自定义的内容

    1.2.1 获取到的对象,根据不同的表结构,获取不同的对象内容,比如book_obj , publiser_obj, authors_obj 等等。

        所以 这些   quser_set = None ,到时候根据不同的表去继承。

    1.2.2 序列化器也不同,所以需要serilizer_class = None 

    1.2.3 定义一个通用的类,来让其他类继承

2、第一次封装

  2.1 定义一个通用的类

class GenericAPIView(APIView):
    queryset = None
    serializer_class = None
    
    def get_queryset(self):                          # 定义get_queryset方法固定写法get_属性名
        return self.queryset.all()
    
    def get_serializer(self, *args, **kwargs):        # 定义一个返回序列化器的类对象的方法,序列化器的参数不同所以用*args 和 **kwargs
        return self.serializer_class(*args, **kwargs)     # 直接返回类的实例化对象
# 其他类继承她的时候,获取的对象就可以通过self.get_queryset() 或 self.serlializer()来获取

  2.2 将get,post,put,delete等请求方法抽离出来

class ListModelMixin(object):                           
    def list(self, request):
        queryset = self.get_queryset()
        ser_obj = self.get_serializer(queryset, many=True)
        return Response(ser_obj.data)
    

class CreateModelMixin(object):
    def create(self, request):
        ser_obj = self.get_serializer(data=request.data)
        if ser_obj.is_valid():
            ser_obj.save()
            return Response(ser_obj.validated_data)
        return Response(ser_obj.errors)
    

class RetrieveModelMixin(object):
    def retrieve(self, request, id):
        book_obj = self.get_queryset().filter(id=id).first()
        ser_obj = BookSerializer(book_obj)
        return Response(ser_obj.data)
    

class UpdateModelMixin(object):
    def update(self, request, id):
        book_obj = self.get_queryset().filter(id=id).first()
        ser_obj = self.get_serializer(instance=book_obj, data=request.data, partial=True)
        if ser_obj.is_valid():
            ser_obj.save()
            return Response(ser_obj.validated_data)
        return Response(ser_obj.errors)
    
    
class DestroyModelMixin(object):
    def destroy(self, request, id):
        book_obj = self.get_queryset().filter(id=id).first()
        if not book_obj:
            return Response("删除的对象不存在")
        book_obj.delete()
        return Response("")

猜你喜欢

转载自www.cnblogs.com/wf123/p/9978409.html
今日推荐