Call a viewset in another viewset with POST method

71 Views Asked by At

I want to call a function of a viewset in another viewset, with POST method. I don't known how to do that :(, I've this error "GET method not allowed" :

url from initial AccessViewset :

access_level_add = accesslevel.AccessViewSet.as_view({"post": "add"})

url from LevelsViewset who need to make a POST :

add_level_by_departement = levels.LevelsViewSet.as_view({"get": "write"})

Here the "initial" POST function. I remove all unnecessary lines :

@action(detail=True, methods=["POST"])
    def add(self, request):
        try:
            data = request.data
            serializer = AccessSerializer(data=data)
            response = self.RESPONSE_ACCESS_LEVEL

            if serializer.is_valid():
                serializer.save()
                response["request_params"] = serializer.data
                response["result"] = {"code_http": status.HTTP_201_CREATED}
                return Response(response, status=status.HTTP_201_CREATED)
            else:
                response["message_error"] = serializer.errors

            response["request_params"] = serializer.data
        except Exception as e:
            message = str(e).lower()
            response["message_error"] = message
            response["result"] = {"code_http": status.HTTP_409_CONFLICT}
            response["request_params"] = request.data
        finally:
            return Response(response, status=status.HTTP_201_CREATED)

and the viewset must reuse the POST method below. The request if from the GER methos, so I can't do that to inject datas with POST method :

@action(detail=True, methods=["POST"])
def write(self, request, departement=None) -> Response:
    try:
        response = {"result": []}           
        #params = {"number" : 44}
        #zm = ZoneViewSet.as_view({"get": "zm"})(request._request, **params).render().content
        params = {
                "target": datetime.now().strftime(self.format_date),
                "value": 9,
                "origin": "auto",
                "zm": 12,
                }
         #post_zm = AccessViewSet.as_view({"post": "add"})(request._request, **params).render().content   
         
         post_accesslevel = AccessViewSet()    # <-----------
         # from the AccessViewet      
         post_accesslevel.add(request)
        
    except ValueError as e:
        response = {"result": {"message_error": status.HTTP_406_NOT_ACCEPTABLE}}
    except Exception as e:
        response = {"result": {"message_error": status.HTTP_503_SERVICE_UNAVAILABLE}}
    finally:
        return Response(response)

In the urls.py :

access_level_add = access.AccessViewSet.as_view({"post": "add"})

Can you help me please ?

Thanks F.

0

There are 0 best solutions below