【发布时间】:2019-09-28 05:09:22
【问题描述】:
我正在尝试使用Django REST framework 和django-multiselectfield 制作一个多选的rest api。
目前在我拥有的模型内:
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: Object of type 'set' is not JSON serializable
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) 的解决方案不满意,因为我可能会使用另一种。
提前致谢,
等。
【问题讨论】:
-
fields.MultipleChoiceField?这是哪里来的? -
如果从序列化程序中删除
animal字段会是什么结果? -
@JPG 验证错误:
{ "animals": ["\"['cat']\" is not a valid choice."]}
标签: python django django-rest-framework django-multiselectfield