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

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中的查询逻辑即可,具体修改点如下:

  1. 替换filter方法为获取单个实例的方法,推荐使用DRF自带的get_object_or_404,同时可以处理数据不存在的场景,避免直接抛出500错误
  2. (可选优化)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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:15:04