想象一下以下模型:
class Person(models.Model):
name = models.CharField()
address_streetname = models.CharField()
address_housenumber = models.CharField()
address_zip = models.CharField()
我有一个公开所有字段的 django rest 框架 ModelSerializer
。
但我希望能够将地址字段序列化为字典。所以当序列化为 json 输出时将是:
{
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()
这导致我的架构正确。我使用 drf-yasg
生成 swagger 文档。它查看序列化程序以生成正确的模型定义。所以序列化程序需要表示架构。
这就是我现在所处的位置。显然现在它失败了,因为 Person
模型中没有 address
属性。你会如何解决这个问题?
最佳答案
来自 DRF-doc for source
说,
The value
source='*'
has a special meaning, and is used to indicate that the entire object should be passed through to the field. This can be useful for creating nested representations, or for fields which require access to the complete object in order to determine the output representation.
所以,试试这个,
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
关于python - 将模型字段序列化为嵌套对象/字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50756557/