Django嵌套模型休息框架工作

时间:2021-06-27 03:29:48

标签: django django-rest-framework

模型.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'。

我错过了什么?

  • 需要在设置页面添加任何内容(我添加了rest_framework)
  • 网址页面中有任何内容吗?

我需要这样的输出

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

3 个答案:

答案 0 :(得分:0)

在您的 PersionSerializeraddress 中添加 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']

只有这样,您才能按预期获得数据。