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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:45:40