在我的模型定义中

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

media_data=JSONField(default=dict)


我创建了一个默认管理员

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

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

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

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

最佳答案

发生了什么。
当深入研究源代码时。我们可以看到以下调用堆栈:


    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)


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

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


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


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


表格

from django.contrib.postgres import forms

class MyJSONField(forms.JSONField):
    empty_values = [None, "", [], ()]


db / fields.py

class MyJSONField(JSONField):
    def formfield(self, **kwargs):
        from ..forms import MyJSONField

        return super().formfield(**{"form_class": MyJSONField, **kwargs})

10-07 17:13