[英]Serialize model fields into nested object/dict
想象一下以下模型:
class Person(models.Model):
name = models.CharField()
address_streetname = models.CharField()
address_housenumber = models.CharField()
address_zip = models.CharField()
我有一個 django rest 框架ModelSerializer
,它公開了所有字段。 但我希望能夠將地址字段序列化為 dict。 所以當序列化為 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
屬性。 你會如何解決這個問題?
值
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
您可以在序列化程序中定義一個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}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.