La convenzione implicita nel codice Django sembra essere quella di memorizzare i valori JSON null come NULL al contrario di una stringa vuota (come è la convenzione per CharField
). Lo dico per i seguenti motivi:
Il empty_strings_allowed
viene ereditato da Field
in CharField
, ed è impostato su 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
, tuttavia, lo sovrascrive con False
:
django/contrib/postgres/fields /jsonb.py#L13
class JSONField(Field):
empty_strings_allowed = False
...
Ciò causa CharField
Il valore predefinito è ""
e JSONField
's a None
quando istanzia un modello senza passare in modo esplicito i valori per questi campi.
django/db /models/fields/inizializzazione .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 ""
Pertanto, se vuoi creare un JSONField
facoltativo, devi usare:
json_field = JSONField(blank=True, null=True)
Se utilizzi solo blank=True
, come faresti per CharField
, riceverai un IntegrityError
quando si tenta di eseguire MyModel.objects.create(...)
senza passare un json_field
argomento in modo esplicito.