Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django REST框架-MultiSelectField-TypeError:类型为';设置';JSON不可序列化_Python_Django_Django Rest Framework_Django Multiselectfield - Fatal编程技术网

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
知道我为什么会有这个例外吗

此外,我可以从multiselectfield切换到另一种技术,如果其他技术可行,并允许我添加多项选择字段,我可以稍后从管理面板筛选这些字段

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)