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

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

想象一下以下模型:

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/

相关文章:

java - 深拷贝/克隆派生类到基类

python - 如果我向函数添加 "else",为什么会得到一个空列表?

python - 有没有办法在单个函数内自动向多个 raw_input()/input() 提供多个输入字符串

python - 在 Python 中添加和比较日期时间

django - django 扩展的问题

python - 如何使用应用程序目录结构为 Django 设置 default_app_config?

php - 不要使用 Symfony 序列化程序显示空元素

python - Scopus API - 本周剩余请求数

mysql - Django 上的 SQL 缓存

c# - 如何序列化\反序列化属性名称依赖于数据的属性