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

获取含嵌套对象的Main对象列表时触发AttributeError问题

解决获取嵌套Main对象列表时的AttributeError问题

问题核心原因

你当前的错误主要来自两个关键点:

  • Serializer处理多对象时的many参数位置错误,导致序列化器把QuerySet当成单个Main实例处理,而QuerySet本身没有transformerNamePlate属性
  • 嵌套序列化器的读写属性配置不符合GET请求的场景需求

修复步骤

1. 修正Serializer的many参数位置

将many=True从Response移至MainDataSerializer的初始化参数中,明确告诉序列化器要处理多个对象:

@api_view(['GET'])
def getSelectedDevice(request):
    try:
        device_id = request.GET.get('dID', None)
        # 预取所有关联对象,避免N+1查询优化性能
        device = Main.objects.filter(dID=device_id).select_related(
            'transformerNamePlate',
            'transformerInfo',
            'detcTapChanger',
            'temperatureCorrectionHV',
            'temperatureCorrectionLV',
            'uk',
            'turnRatioTolerance'
        )
        print("device obg:\n", device)
        # 将many=True传给Serializer,而非Response
        serializer = MainDataSerializer(device, many=True)
        return Response(serializer.data)
    except Main.DoesNotExist:
        return Response(status=404)

2. 调整嵌套Serializer的read_only属性

对于GET读取场景,嵌套序列化器应设置为read_only=True,避免写入校验逻辑干扰读取流程:

class MainDataSerializer(serializers.ModelSerializer):
    transformerNamePlate = TransformerNamePlateSerializer(many=False, read_only=True)
    transformerInfo = TransformerInfoSerializer(many=False, read_only=True)
    detcTapChanger = DETCTapChangerSerializer(many=False, read_only=True)
    temperatureCorrectionHV = TemperatureCorrectionHVSerializer(many=False, read_only=True)
    temperatureCorrectionLV = TemperatureCorrectionLVSerializer(many=False, read_only=True)
    uk = UKSerializer(many=False, read_only=True)
    turnRatioTolerance = TurnRatioToleranceSerializer(many=False, read_only=True)
    
    # 其余原有代码保持不变

3. 验证关联对象完整性

检查数据库中所有Main实例是否都存在对应的TransformerNamePlate关联对象(你的Model中该字段未设置null=True),如果存在无关联的Main实例,访问时也会触发AttributeError。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:50:45