Изменить имена полей в сериализаторе в Django Rest Framework - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть объект, который я хотел бы сериализовать с использованием сериализаторов DRF, но я хотел бы нормализовать некоторые имена полей.Я думал, что смогу использовать атрибут source для достижения этой цели:

user = { 'FirstName': 'John', 'LastName': 'Doe' }

serialized = UserSerializer(data=user)

class UserSerializer(serializers.Serializer):
    first_name = serializers.CharField(source="FirstName")
    last_name = serializers.CharField(source="LastName")

Однако я не уверен, как получить доступ к переданному объекту данных - есть ли способ без создания новогометод или какой-то сложный super() вызов?

edit:

Вариант использования: я использую API, который возвращает значения в CamelCase ('FirstName',«LastName» и т. Д.), Который мне нужен для проверки и изменения имен ключей в случае змеи.Я надеялся, что смогу использовать автономный сериализатор и преобразовать имена в сериализаторе.У меня нет модели для данных, которые должны быть преобразованы.

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Попробуйте:

class UserSerializer(serializers.Serializer):
    FirstName = serializers.CharField(source="first_name")
    LastName = serializers.CharField(source="last_name")

использование (сериализация):

class Person:
    first_name = "first name"
    last_name = "last name"

person1 = Person()
serialized_data = UserSerializer(person1).data # = {"FirstName": "first name", "LastName": "last name"}

использование (десериализация):

data = { 'FirstName': 'John', 'LastName': 'Doe' }
serializer = UserSerializer(data=data)
serializer.is_valid()
valid_deserialized_data = serializer.validated_data # = { 'first_name': 'John', 'last_name': 'Doe' }
0 голосов
/ 23 ноября 2018

Этого можно добиться с помощью свойств вашей модели Django:

class Foo(models.model):
    bar = models.CharField(max_length=40)

    @property
    def sanitized_bar(self):
        print("Getting value")
        return self.bar.lower()



    @sanitized_bar.setter
    def sanitized_bar(self, value):
        self.bar = value.lower()

class FooSerializer(serializers.Serializer):
   bar = CharField(source='sanitized_bar')

Выполнение этого дает вам санитарный контроль над вашей БД, если вам необходимо использовать эти модели в командах управления или где-либо еще, в дополнение кВаш DRF-интерфейс.

Вы также можете сделать хук перед сохранением:

class Foo(models.model):
    def save(self, *args, **kwargs):
        if self.bar:
            self.bar = self.bar.lower()
        super().save(*args, **kwargs)
...