You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 05:07:09