Django Admin:JSONField默认为空dict不会保存在admin中

w--*_*w-- 5 python django django-models django-admin django-jsonfield

在我的模型定义中

from django.contrib.postgres.fields import JSONField
.....
.......
.........

media_data=JSONField(default=dict)
Run Code Online (Sandbox Code Playgroud)

我创建了一个默认管理员

当我尝试保存而不接触该字段时,出现this field is required错误。

必填项

它看起来像一个表单验证问题,因为我可以以编程方式从代码中保存模型实例而不会出现问题。

为什么会这样呢?
我错过了一些愚蠢的事情吗?

ban*_*988 20

  1. 发生了什么。当深入研究源代码时。我们可以看到如下调用栈:
    1) form.is_valid() 
       ->form.full_clean()
        -->form._clean_fields()
         ---> self.cleand_data[name] = field.clean(value)
    2) field.clean(value)
        -> self.to_python(value)
        -> self.validate(value)
Run Code Online (Sandbox Code Playgroud)

当查看源代码时,您会发现,主要是因为empty_values检查。

# These values, if given to validate(), will trigger the self.required check.
EMPTY_VALUES = (None, '', [], (), {})
Run Code Online (Sandbox Code Playgroud)

如您所见,空字典{}是 JSONField 的空值。所以它会引发错误。

  1. 我们可以做什么?解决方案是自定义 models.JSONField 和 forms.JSONField,如下所示。

表格.py

    1) form.is_valid() 
       ->form.full_clean()
        -->form._clean_fields()
         ---> self.cleand_data[name] = field.clean(value)
    2) field.clean(value)
        -> self.to_python(value)
        -> self.validate(value)
Run Code Online (Sandbox Code Playgroud)

数据库/字段.py

# These values, if given to validate(), will trigger the self.required check.
EMPTY_VALUES = (None, '', [], (), {})
Run Code Online (Sandbox Code Playgroud)

  • 这几乎对我来说对“django-mysql”有用。我只需要将 `empty_values = [None, "", [], ()]` 添加到 fields.py 中定义的 `MyJSONField` 以及 forms.py 中定义的 `MyJSONField` 中。(当我只修改 forms.py 中的一个时,输入“{}”会出现“此字段不能为空。”错误,而不是“此字段为必填”错误。) (2认同)

Eyo*_*nyo 7

我遇到了同样的问题。我是怎么解决的?为了绕过排除{}有效 json 的验证过程,我添加了blank=True和null=True。例如:models.JSONField(blank=True, null=True, default=dict)