使用Django REST框架序列化程序展开复合数据

使用Django REST框架序列化程序展开复合数据,django,django-models,django-rest-framework,Django,Django Models,Django Rest Framework,如果我有这样一个模型: class Subject(models.Model): name_first = models.CharField(max_length=200) name_middle = models.CharField(max_length=200, blank=True) name_last = models.CharField(max_length=200) name_prefix = models.CharField(max_length=2

如果我有这样一个模型:

class Subject(models.Model):
    name_first = models.CharField(max_length=200)
    name_middle = models.CharField(max_length=200, blank=True)
    name_last = models.CharField(max_length=200)
    name_prefix = models.CharField(max_length=200, blank=True)
    name_suffix = models.CharField(max_length=200, blank=True)
    favorite_color = models.CharField(max_length=200)
我想反序列化以如下方式发送的数据:

"name": {
            "prefix": "",
            "first": "John",
            "middle": "S",
            "last": "Smith",
            "suffix": ""
        },
  "favorite_color": "blue"

在Django REST框架中如何实现这一点?我希望不必引入
名称
模型。

您可以在序列化程序上重写
from_native
方法,修改
数据
字典,使其在Django REST框架使用它创建实例之前匹配您的模型:

class SubjectSerializer(serializers.ModelSerializer):
    class Meta:
        model = Subject

    def from_native(self, data, files):
        name_fields = data.pop('name', {})
        for key, val in name_fields.items():
            new_key = 'name_{0}'.format(key)
            data[new_key] = val
        return super(SubjectSerializer, self).from_native(data, files)
请注意,这不会对传入数据的格式进行任何验证,因此根据您的情况,您可能需要防止有人提供字典以外的内容。例如,以下数据将导致异常:

"name": "John Smith",
"favorite_color": "blue"