Python Django REST框架-MultiSelectField-TypeError:类型为';设置';JSON不可序列化
我正在尝试使用Python Django REST框架-MultiSelectField-TypeError:类型为';设置';JSON不可序列化,python,django,django-rest-framework,django-multiselectfield,Python,Django,Django Rest Framework,Django Multiselectfield,我正在尝试使用Django rest框架和Django multiselectfield制作一个多选项restapi 目前在模型中,我有: ANIMAL = ( ('dog', 'Dog'), ('cat', 'Cat'), ) class MyForm(models.Model): ... animals = MultiSelectField(choices=ANIMAL) 在我的序列化程序中,我有: class MyFormSerializer(seria
Django rest框架
和Django multiselectfield
制作一个多选项restapi
目前在模型中,我有:
ANIMAL = (
('dog', 'Dog'),
('cat', 'Cat'),
)
class MyForm(models.Model):
...
animals = MultiSelectField(choices=ANIMAL)
在我的序列化程序中,我有:
class MyFormSerializer(serializers.ModelSerializer):
class Meta:
model = MyForm
fields = (..., 'animals')
animals = fields.MultipleChoiceField(choices=ANIMAL)
当我试图使用这种主体发布到api中时:
{
...
"animals": ["cat"],
...
}
我得到一个错误:TypeError:set类型的对象不可JSON序列化
Traceback (most recent call last):
File "C:\Python36\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
response = get_response(request)
File "C:\Python36\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "C:\Python36\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:\Python36\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "c:\mysite\myserver\myform\views.py", line 15, in angels_add
return JsonResponse(serializer.data, status=201)
File "C:\Python36\lib\site-packages\django\http\response.py", line 558, in __init__
data = json.dumps(data, cls=encoder, **json_dumps_params)
File "C:\Python36\lib\json\__init__.py", line 238, in dumps
**kw).encode(obj)
File "C:\Python36\lib\json\encoder.py", line 199, in encode
chunks = self.iterencode(o, _one_shot=True)
File "C:\Python36\lib\json\encoder.py", line 257, in iterencode
return _iterencode(o, 0)
File "C:\Python36\lib\site-packages\django\core\serializers\json.py", line 104, in default
return super().default(o)
File "C:\Python36\lib\json\encoder.py", line 180, in default
o.__class__.__name__)
TypeError: Object of type 'set' is not JSON serializable
不过,表单已经提交,我可以在管理面板中成功地看到整个数据
我正在使用以下版本:
- Django==2.2.1
- djangorestframework==3.9.3
- django multiselectfield==0.1.8
class MyFormAdmin(admin.ModelAdmin):
list_filter = (
'animals',
...
)
我读过关于ArrayField
,但我不喜欢只适合一种db(postgres)的解决方案,因为我可能会使用另一种
提前感谢,
例如,的to_representation()
方法将数据返回为集
创建一个自定义MultipleChiceField类并在序列化程序中使用它
class CustomMultipleChoiceField(fields.MultipleChoiceField):
def to_representation(self, value):
return list(super().to_representation(value))
类MyFormSerializer(serializers.ModelSerializer):
类元:
model=MyForm
字段=(…,“动物”)
动物=自定义多回音字段(选项=动物)
字段。多回音字段
?这是从哪里来的?@JPG如果从序列化程序中删除animal
字段,结果会是什么?@JPG验证错误:{“animals”:[“\”['cat']\”不是有效的选择。“]}
class MyFormSerializer(serializers.ModelSerializer):
class Meta:
model = MyForm
fields = (..., 'animals')
animals = CustomMultipleChoiceField(choices=ANIMAL)