Django代码隐含的约定似乎是 将JSON空值存储为NULL
而不是空字符串(和的约定一样
CharField)。我之所以这样说,是因为以下原因:
在
empty_strings_allowed从继承
Field中
CharField,并设置为
True:
django / db / models / fields / init
。py#L96
class Field(RegisterLookupMixin): """base class for all field types""" # Designates whether empty strings fundamentally are allowed at the # database level. empty_strings_allowed = True ...
JSONField但是,使用以下命令覆盖它
False:
django / contrib / postgres / fields /
jsonb.py#L13
class JSonField(Field): empty_strings_allowed = False ...
这导致
CharField的缺省设置为
""和
JSONField的,以
None当实例模型没有明确地传递值这些字段。
django / db / models / fields / init
.py#L791
def get_default(self): """ Returns the default value for this field. """ if self.has_default(): if callable(self.default): return self.default() return self.default if (not self.empty_strings_allowed or (self.null and not connection.features.interprets_empty_strings_as_nulls)): return None return ""
因此,如果要使之
JSONField可选,则必须使用:
json_field = JSonField(blank=True, null=True)
如果仅使用
blank=True,就像您将要使用的那样
CharField,则
IntegrityError在尝试运行
MyModel.objects.create(...)而未
json_field显式传递参数时会得到一个。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)