使用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"