序列化为namedtuple会引发“太多值无法解包”

2024-04-19 08:30:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用序列化程序来验证和反序列化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)

然后在repl中:

>>> 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)

我做错什么了?你知道吗


Tags: torunnameinselfdatavaluelib
1条回答
网友
1楼 · 发布于 2024-04-19 08:30:30

这不是使用序列化程序的方式。序列化程序用于获取JSON并转换为Python数据类型。如果您想要获取转换后的数据并输出类似于namedtuple的内容,那么您需要实现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')

相关问题 更多 >