Konventionen som antyds från Django-koden verkar vara att lagra null JSON-värden som NULL i motsats till som en tom sträng (som är konventionen för CharField ). Jag säger detta på grund av följande:
empty_strings_allowed ärvs från Field i CharField , och är inställd på 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 , däremot åsidosätter den med False :
django/contrib/postgres/fields /jsonb.py#L13
class JSONField(Field):
empty_strings_allowed = False
...
Detta orsakar CharField 's till standard till "" och JSONField 's till None när du instansierar en modell utan att explicit skicka värdena för dessa fält.
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 ""
Därför, om du vill skapa ett JSONField valfritt, du måste använda:
json_field = JSONField(blank=True, null=True)
Om du bara använder blank=True , som du skulle göra för CharField , får du en IntegrityError när du försöker köra MyModel.objects.create(...) utan att skicka ett json_field argument uttryckligen.