访问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对象,后续序列化操作会因为传入非模型实例报错。
修复步骤
- 补全
get方法的request参数,和其他put/delete方法保持参数顺序一致 - 修改
get_objects的错误处理逻辑,查询失败时抛出404异常而非返回响应对象 - 确认路由配置中路径参数名和方法参数名一致,参考路由规则:
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
相关产品推荐
相关产品推荐

