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

访问Articles/1/接口时报错:get()方法收到'id'参数的多个传值

错误根因排查
  • 核心错误出在ArticleDetails类的get方法参数定义不符合DRF规范:
    DRF的APIView子类中,所有处理HTTP请求的方法(get/post/put/delete等),参数固定顺序为 self -> 请求对象request -> 路由捕获的路径参数。你当前的get方法定义为def get(self, id):,系统调用时会依次传入self、request对象、路由提取的id值,此时第二个参数id会先接收request对象,第三个传入的路径id又会赋值给id参数,直接触发「参数id收到多个值」的类型错误。
  • 附加隐藏问题:get_objects方法查询不到数据时直接返回Response对象,后续序列化操作会因为传入非模型实例报错。
修复步骤
  1. 补全get方法的request参数,和其他put/delete方法保持参数顺序一致
  2. 修改get_objects的错误处理逻辑,查询失败时抛出404异常而非返回响应对象
  3. 确认路由配置中路径参数名和方法参数名一致,参考路由规则:path('Articles/<int:id>/', ArticleDetails.as_view())
修复后完整代码
from django.shortcuts import get_object_or_404
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 Article_List(APIView):
    def get(self,request):
        articles = Article.objects.all()
        serializer = ArticleSerializer(articles, many=True)
        return Response(serializer.data)
    def post(self,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)


class ArticleDetails(APIView):
    def get_objects(self, id):
        # 替换为get_object_or_404快捷方法,查询失败自动抛出404异常
        return get_object_or_404(Article, id=id)

    # 补全request参数
    def get(self, request, id):
        article = self.get_objects(id)
        serializer = ArticleSerializer(article)
        return Response(serializer.data)

    def put(self, request , id):
        article = self.get_objects(id)
        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)
    
    def delete(self, request,id):
        article = self.get_objects(id)
        article.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

内容的提问来源于stack exchange,提问作者SwapniL Pophale

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:15:03