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 makemigrationspython 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
相关产品推荐
相关产品推荐

