Разное название сериализатора данных django

Я хочу сериализовать список диктов, содержащих пробел.
Очевидно, что я не могу написать cat name = serializer.Charfield(...) в Python
. (см. пробел между the и cat).

Итак, я попробовал source=, но получил ошибку.

{ "cat_name": [ "Это поле обязательно для заполнения". ] }

Вот мой код:

class MySerializer(serializers.Serializer):
    cat_name = serializers.CharField(source='Cat name')

s = MySerializer(data={'Cat name': 'Smith'})
s.is_valid(raise_exception=True)

Что я делаю не так?


Обратите внимание, что это не может измениться:

data={'Cat name': 'Smith'}

Вы можете сделать миксин, который переводит ключи в значения, например:

class TranslateMixin:
    translation = {}
    _reverse_translation = None

    @property
    def reverse_translation(self):
        if self._reverse_translation is None:
            type(self)._reverse_translation = {
                v: k for k, v in self.translation.items()
            }
        return self._reverse_translation

    def to_internal_value(self, data):
        super().to_internal_value(
            {self.translation.get(k, k): v for k, v in data.items()}
        )

    def to_representation(self, instance):
        result = super().to_representation(instance)
        return {self.reverse_translation.get(k, k): v for k, v in result.items()}

и затем определите перевод с помощью:

class MySerializer(TranslateMixin, serializers.Serializer):
    cat_name = serializers.CharField()
    translation = {'Cat name': 'cat_name'}

Таким образом, элементы будут предварительно обрабатываться, когда вы используете сериализатор для генерации экземпляров, а после обработки - наоборот, когда вы сериализуете экземпляры.

Однако я бы посоветовал не использовать пробелы в именах полей, причем не на стороне JavaScript. Поскольку поля с пробелами не могут выступать в качестве идентификаторов, это значительно усложняет код.

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