将模型字段序列化为嵌套对象/字典

时间:2018-06-08 08:32:49

标签: python django serialization django-rest-framework drf-yasg

想象一下以下模型:

term_taxonomy_id

我有一个django休息框架class Person(models.Model): name = models.CharField() address_streetname = models.CharField() address_housenumber = models.CharField() address_zip = models.CharField() ,它公开了所有字段。 但我希望能够将地址字段序列化为字典。因此,当序列化为json输出时将是:

ModelSerializer

我尝试创建创建{ name: 'Some name', address: { streetname: 'This is a test', housenumber: '23', zip: '1337', } }

AddressSerializer

然后将class Address(object): ... class AddressSerializer(serializers.Serializer): streetname = serializers.CharField() housenumber = serializers.CharField() zip = serializers.CharField() ... 设置为使用PersonSerializer.address

AddressSerializer

这导致我的架构正确。我使用class PersonSerializer(serializers.ModelSerializer): ... address = AddressSerializer() 生成了一个swagger文档。它查看序列化程序以生成正确的模型定义。因此序列化程序需要表示模式。

所以这就是我现在所处的位置。显然现在它失败了,因为drf-yasg模型中没有address属性。你会怎么解决这个问题?

2 个答案:

答案 0 :(得分:4)

来自DRF-doc for source

表示,

  

source='*'具有特殊含义,用于表示   应该将整个对象传递给该字段。这个可以   对于创建嵌套表示或用于创建嵌套表示的字段非常有用   需要访问整个对象才能确定输出   表示。


所以,试试这个,

class AddressSerializer(serializers.Serializer):
    streetname = serializers.CharField(source='address_streetname')
    housenumber = serializers.CharField(source='address_housenumber')
    zip = serializers.CharField(source='address_zip')


class PersonSerializer(serializers.ModelSerializer):
    # .... your fields
    address = AddressSerializer(source='*')

    class Meta:
        fields = ('address', 'other_fields')
        model = Person

答案 1 :(得分:1)

您可以定义property

class Person(models.Model):
    name = models.CharField()
    address_streetname = models.CharField()
    address_housenumber = models.CharField()
    address_zip = models.CharField()

    @property
    def address(self):
    return {'streetname': self.address_streetname,
            'housenumber': self.address_housenumber,
            'zip': self.address_zip}