簡體   English   中英

將模型字段序列化為嵌套對象/字典

[英]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屬性。 你會如何解決這個問題?

來自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

您可以在序列化程序中定義一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM