La convention implicite du code Django semble être de stocker les valeurs JSON nulles comme NULL par opposition à une chaîne vide (comme c'est la convention pour le CharField
). Je dis cela pour les raisons suivantes :
Le empty_strings_allowed
est hérité de Field
dans CharField
, et est défini sur 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
, cependant, le remplace par False
:
django/contrib/postgres/fields /jsonb.py#L13
class JSONField(Field):
empty_strings_allowed = False
...
Cela provoque CharField
par défaut à ""
et JSONField
's à None
lorsque vous instanciez un modèle sans transmettre explicitement les valeurs de ces champs.
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 ""
Par conséquent, si vous souhaitez créer un JSONField
facultatif, vous devez utiliser :
json_field = JSONField(blank=True, null=True)
Si vous utilisez uniquement blank=True
, comme vous le feriez pour CharField
, vous obtiendrez une IntegrityError
lors de la tentative d'exécution de MyModel.objects.create(...)
sans passer un json_field
argument explicitement.