Сериализация namedtuple вызывает «слишком много значений для распаковки» - PullRequest
0 голосов
/ 18 мая 2019

Я хотел бы использовать Serializer для проверки и десериализации JSON.

Я пробовал:

Candidate = namedtuple("Candidate",
    ["name", "description"]
)

class CandidateSerializer(serializers.Serializer):
    name = serializers.CharField()
    description = serializers.CharField()

    def to_internal_value(self, data):
        return Candidate(**data)

А затем в ответе:

>>> s = CandidateSerializer(data={'name': "Seb", 'description':"Hello"})
>>> s.is_valid()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python3.6/site-packages/rest_framework/serializers.py", line 236, in is_valid
    self._validated_data = self.run_validation(self.initial_data)
  File "/usr/local/lib/python3.6/site-packages/rest_framework/serializers.py", line 436, in run_validation
    self.run_validators(value)
  File "/usr/local/lib/python3.6/site-packages/rest_framework/serializers.py", line 465, in run_validators
    to_validate.update(value)
ValueError: too many values to unpack (expected 2)

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

1 Ответ

1 голос
/ 18 мая 2019

Это не так, как вы используете сериализатор. Сериализатор предназначен для получения JSON и преобразования в типы данных Python. Если затем вы хотите взять преобразованные данные и вывести что-то вроде именованного кортежа, вам нужно реализовать create() и вызвать его через save(). Итак:

class CandidateSerializer(serializers.Serializer):
    name = serializers.CharField()
    description = serializers.CharField()

    def create(self, validated_data):
        return Candidate(**validated_data)

Сейчас:

>>> s = CandidateSerializer(data={'name': "Seb", 'description':"Hello"})
>>> s.is_valid()
True
>>> s.save()
Candidate(name='Seb', description='Hello')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...