Djangoコードから暗示される規則は、nullJSON値を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
を渡さずに 明示的に引数。