Django框架中ModelViewSet的Get/Delete请求URL传ID问题求助
问题分析与修正方案
错误原因
方法签名不符合DRF规范:
get_queryset方法的正确签名是def get_queryset(self):,不需要额外传入mid参数;destroy方法的正确签名是def destroy(self, request, *args, **kwargs):,错误的参数定义会导致请求时参数缺失报错。- DRF视图方法会通过
self.kwargs自动获取URL中的路径参数,无需手动在方法参数中声明。
URL路由配置错误:
DRF的router会自动生成标准REST路由(列表路由/prefix/、详情路由/prefix/{pk}/),手动在router.register的路径中写正则捕获object_id会破坏router的默认路由规则,导致请求无法匹配到正确的视图方法,进而出现"Delete方法不被允许"的错误。对ModelViewSet默认逻辑不熟悉:
ModelViewSet已内置retrieve(处理单个对象GET请求)和destroy(处理单个对象DELETE请求)方法,无需自行重新实现展示/删除逻辑,只需确保queryset或get_queryset返回正确数据集即可。
修正后的代码实现
视图代码
from rest_framework import viewsets, permissions from .models import ObjectModel # 替换为你的实际模型类 from .serializers import ObjectSerializer class DeleteOrShowView(viewsets.ModelViewSet): serializer_class = ObjectSerializer permission_classes = [permissions.IsAuthenticated] http_method_names = ['get', 'delete'] # 仅允许GET和DELETE请求 queryset = ObjectModel.objects.all() # 若需自定义过滤,可重写get_queryset # 可选:自定义查询集过滤(比如仅返回当前用户的对象) # def get_queryset(self): # return self.queryset.filter(owner=self.request.user) # 可选:自定义删除逻辑(默认逻辑已能完成删除操作) # def destroy(self, request, *args, **kwargs): # instance = self.get_object() # # 此处可添加删除前的校验或额外操作 # self.perform_destroy(instance) # return Response(status=status.HTTP_204_NO_CONTENT)
URL配置代码
from django.urls import path, include from rest_framework.routers import DefaultRouter from . import views router = DefaultRouter() # router自动生成路由: # - 列表路由:/objects/(GET请求,返回所有对象,受http_method_names限制仅允许GET) # - 详情路由:/objects/{pk}/(GET请求返回单个对象,DELETE请求删除该对象) router.register('objects', views.DeleteOrShowView, basename='do_stuff') urlpatterns = [ path('', include(router.urls)), ]
验证方式
- 发送
GET /objects/1/(1为目标对象ID):返回对应ID的对象详情 - 发送
DELETE /objects/1/:删除对应ID的对象
此配置可正确从URL中获取ID并完成展示/删除操作,解决之前的参数缺失和方法不允许问题。
内容的提问来源于stack exchange,提问作者Lin
相关产品推荐
相关产品推荐

