Django REST Framework: Изменение ключей во время десериализации

Я пишу небольшое приложение на Django, используя djangorestframework. Цель довольно проста: Я хочу иметь возможность получать запрос методом http POST с прикрепленным к нему json-объектом. В конце я хочу вернуть тот же json-объект, но с другими значениями ключей. Если быть точным, я хочу перевести значения ключей с немецкого на английский.

Так вот что бы я получил: { "vorname": "John", "nachname": "Doe" }

И это то, что я хочу вернуть: { "firstname": "John", "lastname": "Doe" }

Я пытаюсь сделать это с помощью сериализатора, и он вроде как уже работает, но не так, как мне хотелось бы.

Вот модель, которую я использую:

class Name(models.Model):
    firstname = models.CharField(max_length=255)
    lastname = models.CharField(max_length=255)

А это сериализатор:

class NameSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Name
        fields = ['firstname', 'lastname']

И, конечно, существует также мнение:

@api_view(['POST'])
@parser_classes([JSONParser])
def convert(request):
    request.data['firstname'] = request.data.pop('Vorname')
    request.data['lastname'] = request.data.pop('Nachname')
    serializer = NameSerializer(data=request.data)

    if serializer.is_valid():
        print(serializer.data)
        serializer.save()
        return Response(serializer.data, status=status.HTTP_200_OK)  
    return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Как я уже сказал, это уже работает с использованием dict.pop() для преобразования словаря request.data. Но я бы хотел, чтобы он управлял преобразованием внутри сериализатора, если это возможно. Чтобы в представлении не требовалось никакого дополнительного кода. После многочасового поиска у меня просто кружится голова, и я понятия не имею, возможно ли это вообще.

Итак, вопрос заключается в следующем: Как мне сопоставить немецкие ключи с английскими, используя только сериализатор?

Итак, я нашел ответ на этот вопрос для тех, кто еще ищет. Он не идеален, и я чувствую, что есть лучший способ сделать это. Если у вас есть идея получше, пожалуйста, не стесняйтесь опубликовать ее здесь =)

Я просто написал переопределение функции __init__ внутри моего сериализатора, так что теперь он выглядит следующим образом:

class NameSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Name
        fields = ['firstname', 'lastname']

    def __init__(self, instance=None, data=empty, **kwargs):
        super().__init__(instance, data, **kwargs)
        self.initial_data['firstname'] = self.initial_data.pop('Vorname')
        self.initial_data['lastname'] = self.initial_data.pop('Nachname')

Итак, я в основном перенес решение, которое у меня было раньше, на сериализатор. Это не кажется чистым, но это работает!

Вернуться на верх