如何在基于类的视图(Class Based View)中实现多个POST请求处理方法
Great question! When working with DRF's APIView, you don’t get built-in support for multiple post methods, but you can easily route requests to your custom post_modelA and post_modelB methods by adding a central post method that acts as a dispatcher. Here are two clean approaches to implement this:
Approach 1: Route via Query Parameter
Use a query parameter (like ?model=A) to tell the view which model’s creation logic to run. This keeps your URL structure simple while allowing flexibility.
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .serializers import ModelASerializer, ModelBSerializer class Test(APIView): def post_modelA(self, request): # Logic to create Model A instance serializer = ModelASerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) def post_modelB(self, request): # Logic to create Model B instance serializer = ModelBSerializer(data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data, status=status.HTTP_201_CREATED) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) def post(self, request, *args, **kwargs): # Dispatch to the correct method based on query param model_type = request.query_params.get('model') if model_type == 'A': return self.post_modelA(request) elif model_type == 'B': return self.post_modelB(request) else: return Response( {"error": "Invalid model type. Use 'A' or 'B' as query parameter."}, status=status.HTTP_400_BAD_REQUEST )
How to use it: Send a POST request to /test/ with ?model=A or ?model=B in the URL.
Approach 2: Route via URL Path Parameter
For a more RESTful approach, use distinct URL paths to target each model’s creation endpoint. This makes your API’s purpose clearer at a glance.
First, update your urls.py:
from django.urls import path from .views import Test urlpatterns = [ path('test/modelA/', Test.as_view(), name='create-modelA'), path('test/modelB/', Test.as_view(), name='create-modelB'), # Or use a dynamic path: path('test/<str:model_type>/', Test.as_view(), name='create-model') ]
Then adjust your view:
class Test(APIView): def post_modelA(self, request): # Same Model A creation logic as above ... def post_modelB(self, request): # Same Model B creation logic as above ... def post(self, request, *args, **kwargs): # Get the model type from URL kwargs (if using dynamic path) # model_type = kwargs.get('model_type') # Or check the request path directly for static paths if '/modelA/' in request.path: return self.post_modelA(request) elif '/modelB/' in request.path: return self.post_modelB(request) else: return Response( {"error": "Invalid endpoint. Use /test/modelA/ or /test/modelB/."}, status=status.HTTP_400_BAD_REQUEST )
How to use it: Send POST requests directly to /test/modelA/ or /test/modelB/.
Quick Notes:
- If your logic for each model is significantly different, consider splitting them into separate
APIViewsubclasses for better maintainability. - Always use serializers to validate incoming data (as shown in examples) instead of directly accessing
request.data—this ensures data integrity and follows DRF best practices.
内容的提问来源于stack exchange,提问作者Gaurav Dhameeja

