在我的模型定义中
from django.contrib.postgres.fields import JSONField
.....
.......
.........
media_data=JSONField(default=dict)
我创建了一个默认管理员
当我尝试保存而不接触该字段时,出现
this field is required
错误。它看起来像一个表单验证问题,因为我可以以编程方式从代码中保存模型实例,而不会出现问题。
为什么会这样呢?
我错过了一些愚蠢的事情吗?
最佳答案
发生了什么。
当深入研究源代码时。我们可以看到以下调用堆栈:
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})