想象一下以下模型:
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
属性。你会怎么解决这个问题?
答案 0 :(得分:4)
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}