2017-04-23 60 views
0

我正在使用DJango REST Framework模塊在DJango中工作。創建自APIView繼承的自定義抽象視圖類

對於每個模型我做,我有一個觀點:

class CustomAPIView(APIView): 
    renderer_classes = (JSONRenderer,) 
    permission_classes = (IsAuthenticated,) 

    @csrf_exempt 
    def post(self, request): 
     raw_data = serializers.SearchStateSerializer(data=request.data) 
     if raw_data.is_valid(): 
      searched_data = serializers.ShowStateSerializer(data=serializers.State.objects.extra(where=raw_data.data['where'], order_by=raw_data.data['order_by']), many=True) 
      return JsonResponse(paginate_data(searched_data=searched_data, request_data=raw_data), status=status.HTTP_202_ACCEPTED) 

     else: 
      return JsonResponse(raw_data.errors, status=status.HTTP_400_BAD_REQUEST) 

在這段代碼中,有3個約束條件發生變化:

  1. SearchStateSerializer
  2. ShowStateSerializer
  3. 國家(型號)

所以我想創建一個抽象,我只指定這3件事情和視圖的作品。我怎樣才能做到這一點?我搜索了很多,但沒有運氣。必須提供這3個約束,否則會引發錯誤。

回答

2

使用這個作爲你的父類:

class CustomAPIView(APIView): 
    renderer_classes = (JSONRenderer,) 
    permission_classes = (IsAuthenticated,) 
    search_state_serializer_class = None 
    show_state_serializer_class = None 
    state_model = None 


    @csrf_exempt 
    def post(self, request): 
     raw_data = self.search_state_serializer_class(data=request.data) 
     if raw_data.is_valid(): 
      searched_data = self.show_state_serializer_class(
           data=(self.state_model.objects 
             .extra(where=raw_data.data['where'], 
              order_by=raw_data.data['order_by'])), 
             many=True) 
     return JsonResponse(paginate_data(searched_data=searched_data, request_data=raw_data), status=status.HTTP_202_ACCEPTED) 
    else: 
     return JsonResponse(raw_data.errors, status=status.HTTP_400_BAD_REQUEST) 

現在你可以簡單地類字段的值和POST方法會奏效。

class MyView(CustomApiView): 
    search_state_serializer_class = MySearchStateSerializer 
    show_state_serializer_class = MyShowStateSerializer 
    state_model = MyStateModel 
+0

非常感謝!只是想知道有沒有更好的辦法? – iamhssingh

+0

這是製作泛型類的方法。另一種方法是使用get_serializer_class之類的get方法。在這種情況下,您可以重寫方法。 –