Разворачивание составных данных с помощью сериализаторов Django REST Framework

#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"