模型.py
class Persion (models.Model):
name = models.TextField(max_length=300)
age = models.IntegerField()
class Address(models.Model):
city = models.TextField(max_length=300)
state = models.TextField(max_length=300)
Serializer.py:
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']
错误信息:
尝试获取序列化程序 address
上的字段 PersionSerializer
的值时出现 AttributeError。
序列化器字段可能命名不正确,并且与 Persion
实例上的任何属性或键都不匹配。
原始异常文本为:'Persion' 对象没有属性 'address'。
我错过了什么?
我需要这样的输出
[
{ name:"nikhil",
age: 24,
address:{
city:"coimbatore",
}
}]
答案 0 :(得分:0)
在您的 PersionSerializer
的 address
中添加 many=True
,如下所示:
class PersionSerializer(serializers.ModelSerializer):
address = AddressSerializer( required= True, many=True )
class Meta:
model = Persion
fields = ['name', 'age' , 'address']
因为您要返回一个对象列表。查看文档 here。
答案 1 :(得分:0)
class PersionSerializer(serializers.ModelSerializer):
class Meta:
model = Persion
fields = (
"name",
"age",
)
def to_representation(self, instance):
data = super().to_representation(instance)
data['address] = AddressSerializer(Address.objects.all(),many=True).data
return data
如果要发送所有地址,这也是一种方式 如果您想根据个人模型使用您现在没有的外键进行过滤,您可以通过这种方式假设地址模型中的 person_id。
class PersionSerializer(serializers.ModelSerializer):
class Meta:
model = Persion
fields = (
"name",
"age",
)
def to_representation(self, instance):
data = super().to_representation(instance)
data['address] = AddressSerializer(Address.objects.filter(person_id=data["id"]),many=True).data
return data
希望它会有所帮助:)
答案 2 :(得分:0)
角色模型没有属性地址。 你可能正在做
persion = Persion.objects.first()
persion_serialized = PersionSerializer(persion).data
或
persion = Persion.objects.all()
persion_serialized = PersionSerializer(persion, many=True).data
现在的问题是Persion模型对象没有属性地址。
实际上对于您的预期结果,您的 Persion 模型应该是这样的:
class Address(models.Model):
city = models.TextField(max_length=300)
state = models.TextField(max_length=300)
class Persion (models.Model):
name = models.TextField(max_length=300)
age = models.IntegerField()
address = models.ForeignKey(Address, on_delete=models.SET_NULL, null=True)
另外我认为你的 PersionSerializer 应该是这样的:
class PersionSerializer(serializers.ModelSerializer):
address = AddressSerializer(read_only=True)
class Meta:
model = Persion
fields = ['name', 'age' , 'address']
只有这样,您才能按预期获得数据。