获取含嵌套对象的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
相关产品推荐
相关产品推荐

