如何在DRF类基API中复用URL与类处理PUT/GET/POST/DELETE请求?
同一APIView类处理多URL的实现方案
首先确认你的思路完全没问题,DRF的APIView本身就支持在同一个类里整合多个HTTP方法,并且可以通过不同URL路由到这个类,只要在方法里根据参数区分逻辑就行,完全不用拆成多个类。
下面是具体实现步骤:
1. 编写Articles视图类
在views.py里实现包含get、put、post、delete方法的APIView子类,根据是否传入pk参数区分业务逻辑:
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .models import Article from .serializers import ArticleSerializer class Articles(APIView): # 获取单篇文章(需pk) def get(self, request, pk=None): if not pk: return Response({"error": "请提供文章ID"}, status=status.HTTP_400_BAD_REQUEST) try: article = Article.objects.get(pk=pk) serializer = ArticleSerializer(article) return Response(serializer.data) except Article.DoesNotExist: return Response({"error": "文章不存在"}, status=status.HTTP_404_NOT_FOUND) # 修改文章(需pk) def put(self, request, pk): try: article = Article.objects.get(pk=pk) serializer = ArticleSerializer(article, data=request.data) if serializer.is_valid(): serializer.save() return Response(serializer.data) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) except Article.DoesNotExist: return Response({"error": "文章不存在"}, status=status.HTTP_404_NOT_FOUND) # 删除文章(需pk) def delete(self, request, pk): try: article = Article.objects.get(pk=pk) article.delete() return Response({"message": "文章删除成功"}, status=status.HTTP_204_NO_CONTENT) except Article.DoesNotExist: return Response({"error": "文章不存在"}, status=status.HTTP_404_NOT_FOUND) # 新增文章(无需pk) def post(self, request, pk=None): # 可选:禁止在带pk的路径调用post新增 if pk is not None: return Response({"error": "新增文章请勿传入ID"}, status=status.HTTP_400_BAD_REQUEST) serializer = ArticleSerializer(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)
2. 配置URL路由
在urls.py里把两个目标URL都指向这个Articles视图类:
from django.urls import path from .views import Articles urlpatterns = [ # 处理带pk的获取、修改、删除请求 path('articles/<int:pk>/', Articles.as_view(), name='article-detail'), # 处理新增文章的post请求 path('articles/add/', Articles.as_view(), name='article-add'), ]
补充说明
- 访问
/articles/<int:pk>/时,DRF会根据HTTP方法自动调用对应的get/put/delete方法; - 访问
/articles/add/时,只会触发post方法(如果用get访问这个路径会进入get方法,返回缺少ID的错误,符合预期); - 代码里的
pk=None是为了适配/articles/add/路径没有pk参数的情况,确保视图类能正常接收请求。
内容的提问来源于stack exchange,提问作者Alireza
相关产品推荐
相关产品推荐

