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

Django RetrieveUpdateDestroyAPIView报AssertionError,请求排查原因

解决Django REST Framework中RetrieveUpdateDestroyAPIView的AssertionError问题

你碰到的这个错误其实是DRF通用视图的默认逻辑导致的——RetrieveUpdateDestroyAPIView天生是用来处理单个对象的请求(获取、更新、删除某一条记录),它默认要求URL里带有pk这个关键字参数,用来定位要操作的具体对象。但你的视图里是通过请求的query参数id来过滤Groupid,和这个默认逻辑不匹配,所以才会抛出断言错误。

下面给你两种可行的解决思路:

思路一:适配DRF的默认逻辑,修改URL配置

把URL改成带pk参数的形式,让视图能通过默认的主键字段找到对象。比如你的URLconf可以这么写:

path('edit-order-students/<int:pk>/', EditOrderStudents.as_view(), name='edit-order-students'),

之后请求就用/edit-order-students/123/这种路径格式(123是你要操作的记录的主键值),而不是?id=123的query参数。这时候你甚至可以删掉自定义的get_queryset方法,通用视图会自动用URL里的pk去匹配模型的主键字段,完成单实例的查找。

思路二:自定义查找规则,继续用query参数id

如果你坚持要用query参数id来通过Groupid字段定位对象,那需要调整视图的配置或者重写get_object方法:

方法A:修改lookup相关属性

如果你的Groupid是模型的唯一字段,可以直接指定视图的lookup_field:

class EditOrderStudents(generics.RetrieveUpdateDestroyAPIView):
    #permission_classes = (permissions.AllowAny,)
    authentication_classes = (TokenAuthentication, )
    serializer_class = newOrdersStudentSerializidGet
    lookup_field = 'Groupid'  # 指定用Groupid作为查找字段

不过这种方式还是需要URL里带对应参数,如果你一定要用query参数的话,更合适的是重写get_object方法:

方法B:重写get_object方法

from django.shortcuts import get_object_or_404

class EditOrderStudents(generics.RetrieveUpdateDestroyAPIView):
    #permission_classes = (permissions.AllowAny,)
    authentication_classes = (TokenAuthentication, )
    serializer_class = newOrdersStudentSerializidGet

    def get_object(self):
        # 从query参数里获取id
        group_id = self.request.query_params.get('id')
        # 查找对应对象,找不到返回404
        obj = get_object_or_404(newOrdersStudent, Groupid=group_id)
        # 检查对象权限(如果有设置的话)
        self.check_object_permissions(self.request, obj)
        return obj

注意:这种方式下Groupid必须是唯一的,否则get_object_or_404会返回多条记录,导致报错。

内容的提问来源于stack exchange,提问作者hamid ashoor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 11:37:49