【问题标题】:Django REST framework - MultiSelectField - TypeError: Object of type 'set' is not JSON serializableDjango REST 框架 - MultiSelectField - TypeError:“set”类型的对象不是 JSON 可序列化的
【发布时间】:2019-09-28 05:09:22
【问题描述】:

我正在尝试使用Django REST frameworkdjango-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


【解决方案1】:

source codeMultipleChoiceFieldto_representation()方法返回数据为set强>

创建一个自定义的 MultipleChoiceField 类并在您的序列化程序中使用它

class CustomMultipleChoiceField(fields.MultipleChoiceField):
    def to_representation(self, value):
        return list(super().to_representation(value))
class MyFormSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyForm
        fields = (..., 'animals')

    animals = CustomMultipleChoiceField(choices=ANIMAL)

【讨论】:

    猜你喜欢
    • 2020-07-05
    • 2021-06-18
    • 2021-12-03
    • 2020-12-13
    • 1970-01-01
    • 2022-07-01
    • 2023-01-10
    • 1970-01-01
    • 2020-12-02
    相关资源
    最近更新 更多