Django DRF多对多关系序列化时出现AttributeError求助
解决Django多对多中间表序列化的AttributeError问题
错误信息
AttributeError: 尝试在序列化器Ped_ProSerializer上获取字段produto的值时出现AttributeError。序列化器字段的名称可能不正确,与Produto实例上的任何属性或键都不匹配。原始异常文本为:'Produto' object has no attribute 'produto'。
问题原因
PedidoSerializer的字段定义逻辑错误:
Pedido模型中的itens是直接关联Produto的多对多字段,返回的是Produto实例集合- 但你用
Ped_ProSerializer去序列化itens字段,而Ped_ProSerializer期望处理的是中间表Ped_Pro的实例,而非Produto实例,因此会触发Produto没有produto属性的错误(该属性属于Ped_Pro模型)
解决方案
方案1:直接关联中间表的关联字段
利用Pedido模型与中间表Ped_Pro的related_name="ped_pros",替换序列化器中的字段名:
class PedidoSerializer(ModelSerializer): # 用中间表的关联字段ped_pros替代itens ped_pros = Ped_ProSerializer(many=True, read_only=True) class Meta: model = Pedido fields = "__all__"
如果需要同时保留纯商品数据(原itens字段),只需将ped_pros加入fields列表即可。
方案2:自定义字段保留原字段名(可选)
若希望继续使用itens作为字段名返回中间表数据,使用SerializerMethodField自定义序列化逻辑:
from rest_framework import serializers class PedidoSerializer(ModelSerializer): itens = serializers.SerializerMethodField() def get_itens(self, obj): # 从中间表获取当前订单关联的Ped_Pro实例 ped_pros = obj.ped_pros.all() return Ped_ProSerializer(ped_pros, many=True).data class Meta: model = Pedido fields = "__all__"
额外优化:嵌套商品详情
如果需要在中间表数据中同时返回完整商品信息,修改Ped_ProSerializer实现嵌套序列化:
class Ped_ProSerializer(ModelSerializer): # 嵌套序列化关联的商品详情 produto = ProdutoSerializer(read_only=True) class Meta: model = Ped_Pro fields = "__all__"
内容的提问来源于stack exchange,提问作者Erico Pieri
相关产品推荐
相关产品推荐

