【问题标题】:Django nested model rest frame wrokDjango 嵌套模型休息框架
【发布时间】:2021-06-27 03:29:48
【问题描述】:

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

错误信息:

尝试在序列化程序 PersionSerializer 上获取字段 address 的值时出现 AttributeError。 序列化程序字段可能命名不正确,并且与 Persion 实例上的任何属性或键都不匹配。 原始异常文本是:“Persion”对象没有属性“address”。

我错过了什么?

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

我需要这样的输出

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

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:
    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 模型使用你现在没有的外键进行过滤,你可以通过这种方式假设地址模型中的 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】:

      在您的PersionSerializeraddress 中添加many=True,如下所示:

      class PersionSerializer(serializers.ModelSerializer):
          address = AddressSerializer( required= True, many=True )
          class Meta:
              model = Persion
              fields = ['name', 'age' , 'address']
      

      因为您要返回一个对象列表。查看文档here

      【讨论】:

        【解决方案3】:

        Persion 模型没有属性地址。 你可能在做

        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']
        

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-11
          • 2014-05-31
          • 2019-08-06
          • 1970-01-01
          • 1970-01-01
          • 2013-04-08
          相关资源
          最近更新 更多