#django #django-models #django-rest-framework
#django #django-модели #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=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 Framework? Я бы предпочел не вводить Name
модель.
Ответ №1:
Вы могли бы переопределить from_native
метод в вашем сериализаторе, изменив data
словарь так, чтобы он соответствовал вашей модели, прежде чем платформа 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"