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

Django DRF嵌套序列化器报Persion实例无address属性错误如何解决

问题原因

报错的核心原因是两个模型之间没有建立关联关系,Persion模型实例本身不存在address属性,该问题和urls配置无关,不需要修改urls文件。

修复步骤

1. 修正模型关联

要实现你需要的嵌套输出,首先需要给两个模型添加关联,这里采用一对一关联(一个人对应一个地址),修改Models.py代码:

class Persion(models.Model):
    name = models.TextField(max_length=300)
    age = models.IntegerField()

class Address(models.Model):
    # 新增外键关联到Persion,related_name设置为address,这样Persion实例就能通过.address访问对应的地址
    persion = models.OneToOneField(Persion, on_delete=models.CASCADE, related_name="address")
    city = models.TextField(max_length=300)
    state = models.TextField(max_length=300)

修改完成后执行数据库迁移命令:
python manage.py makemigrations
python manage.py migrate

2. 调整序列化器(可选:支持写入操作)

如果只是查询场景,你现有的序列化器已经可以正常返回目标格式。如果需要支持POST/PUT等写入操作,需要重写序列化器的create方法处理嵌套数据:

class AddressSerializer(serializers.ModelSerializer):
    class Meta:
        model = Address
        fields = '__all__'

class PersionSerializer(serializers.ModelSerializer):
    address = AddressSerializer(required=True)
    class Meta:
        model = Persion
        fields = ['name', 'age', 'address']
    
    # 新增create方法处理嵌套数据写入
    def create(self, validated_data):
        address_data = validated_data.pop('address')
        persion = Persion.objects.create(**validated_data)
        Address.objects.create(persion=persion, **address_data)
        return persion
输出验证

完成上述修改后,接口就会返回你需要的格式,如果不需要返回address的id和关联的persion字段,只需要修改AddressSerializer的fields配置即可:

class AddressSerializer(serializers.ModelSerializer):
    class Meta:
        model = Address
        fields = ['city']

最终返回效果:

[
    {
        "name": "nikhil",
        "age": 24,
        "address": {
            "city": "coimbatore"
        }
    }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 06:24:03