1. 程式人生 > >DRF之檢視元件 三次封裝

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("")