Django REST Framework PUT请求报500,QuerySet无_meta属性如何解决
错误原因
你遇到的AttributeError: 'QuerySet' object has no attribute '_meta'报错,核心问题出在视图层的查询逻辑:
Django REST Framework的ModelSerializer执行更新操作时,第一个入参需要传入单个模型实例对象,但你使用DeviceDetail.objects.filter(DD2DKEY=pk)查询,返回的是QuerySet集合对象,哪怕集合中仅包含一条数据,也不属于单个模型实例,序列化器执行更新逻辑时无法从QuerySet上读取模型元数据,因此触发报错。
解决方案
直接修改视图update_device中的查询逻辑即可,具体修改点如下:
- 替换
filter方法为获取单个实例的方法,推荐使用DRF自带的get_object_or_404,同时可以处理数据不存在的场景,避免直接抛出500错误 - (可选优化)PUT请求对应资源更新操作,成功后建议返回
200 OK状态码而非201 Created(201状态码用于资源创建成功场景)
修改后的完整视图代码:
# 先导入工具方法 from rest_framework.generics import get_object_or_404 @api_view(['PUT']) def update_device(request, pk=None): if pk is not None: # 替换原有filter查询,直接获取单个DeviceDetail实例 devicedetail = get_object_or_404(DeviceDetail, DD2DKEY=pk) devdserializer = DeviceDetailSerializers(devicedetail, data = request.data) if devdserializer.is_valid(): devdserializer.save() results = { "device_details" : devdserializer.data, } # 状态码调整为200 return Response(results, status=status.HTTP_200_OK) return Response(devdserializer.errors, status=status.HTTP_400_BAD_REQUEST)
额外注意事项
你当前的DeviceDetail模型中__str__方法返回了self.hostname,但模型字段定义中没有hostname字段,后续调用该模型实例的字符串表示时会触发报错,建议将返回值修改为已存在的字段(例如self.mgt_interface),或者补充hostname字段定义。
内容的提问来源于stack exchange,提问作者L.Calvin
相关产品推荐
相关产品推荐

