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')
Итак, я в основном перенес решение, которое у меня было раньше, на сериализатор. Это не кажется чистым, но это работает!