A convenção implícita no código Django parece ser armazenar valores JSON nulos como NULL ao invés de uma string vazia (como é a convenção para o
CharField
). Digo isso pelo seguinte:O
empty_strings_allowed
é herdado de Field
em CharField
, e está definido como 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
, no entanto, substitui-o por False
:django/contrib/postgres/fields /jsonb.py#L13
class JSONField(Field):
empty_strings_allowed = False
...
Isso faz com que
CharField
's para usar como padrão ""
e JSONField
's para None
quando você instancia um modelo sem passar explicitamente os valores para esses campos. 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 ""
Portanto, se você quiser fazer um
JSONField
opcional, você deve usar:json_field = JSONField(blank=True, null=True)
Se você usar apenas
blank=True
, como faria para CharField
, você receberá um IntegrityError
ao tentar executar MyModel.objects.create(...)
sem passar um json_field
argumento explicitamente.