Разное название сериализатора данных 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. Поскольку поля с пробелами не могут выступать в качестве идентификаторов, это значительно усложняет код.