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

Django中如何合并同模型带自定义字段的多个序列化器?

问题原因

你遇到的AttributeError是因为DRF的ModelSerializer默认会把some_name、some_subject这类字段当成UserAccount模型的属性去查找,但你的模型里根本没有这两个字段,所以报错。单独使用子序列化器时,你是直接把UserAccount实例传给它们,所以能正常工作;但组合到FullSerializer时,DRF的默认逻辑走偏了。

解决方案

有两种简单的修复方式,任选其一即可:

方式一:用SerializerMethodField手动调用子序列化器

修改FullSerializer,通过SerializerMethodField手动处理子序列化器的调用:

class FullSerializer(serializers.ModelSerializer):
    some_name = serializers.SerializerMethodField()
    some_subject = serializers.SerializerMethodField()

    class Meta : 
        model = UserAccount
        fields = ["some_name" , "some_subject"]

    def get_some_name(self, obj):
        # 把当前UserAccount实例传给NameSerializer
        return NameSerializer(obj).data
    
    def get_some_subject(self, obj):
        # 把当前UserAccount实例传给SubjectSerializer
        return SubjectSerializer(obj).data

方式二:给子序列化器设置source='.'

直接在子序列化器字段上指定source='.',告诉DRF使用整个当前对象作为子序列化器的数据源,而不是去查找某个属性:

class FullSerializer(serializers.ModelSerializer):
    # source='.' 表示使用当前整个UserAccount实例作为数据源
    some_name = NameSerializer(source='.')
    some_subject = SubjectSerializer(source='.')

    class Meta : 
        model = UserAccount
        fields = ["some_name" , "some_subject"]

两种方式都能让FullSerializer正确调用子序列化器处理同一个UserAccount实例,输出你需要的嵌套结构,同时保留子序列化器的复用性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:20:28