La convención implícita del código Django parece ser almacenar valores JSON nulos como NULL a diferencia de una cadena vacía (como es la convención para el CharField
). Digo esto por lo siguiente:
El empty_strings_allowed
se hereda de Field
en CharField
y se establece en 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
, sin embargo, lo anula con False
:
django/contrib/postgres/fields /jsonb.py#L13
class JSONField(Field):
empty_strings_allowed = False
...
Esto hace que CharField
's por defecto a ""
y JSONField
's a None
cuando crea una instancia de un modelo sin pasar explícitamente los valores para estos campos.
django/db /modelos/campos/inicio .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 ""
Por lo tanto, si desea crear un JSONField
opcional, tienes que usar:
json_field = JSONField(blank=True, null=True)
Si usa solo blank=True
, como lo haría para CharField
, obtendrá un IntegrityError
al intentar ejecutar MyModel.objects.create(...)
sin pasar un json_field
argumento explícitamente.