Konventionen antydet fra Django-koden ser ud til at være at lagre null JSON-værdier som NULL i modsætning til som en tom streng (som konventionen er for CharField
). Jeg siger dette på grund af følgende:
empty_strings_allowed
er nedarvet fra Field
i CharField
, og er indstillet til 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
, dog tilsidesætter det med False
:
django/contrib/postgres/fields /jsonb.py#L13
class JSONField(Field):
empty_strings_allowed = False
...
Dette forårsager CharField
's er som standard ""
og JSONField
's til None
når du instansierer en model uden eksplicit at videregive værdierne for disse felter.
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 ""
Derfor, hvis du vil lave et JSONField
valgfrit, du skal bruge:
json_field = JSONField(blank=True, null=True)
Hvis du kun bruger blank=True
, som du ville gøre for CharField
, får du en IntegrityError
når du forsøger at køre MyModel.objects.create(...)
uden at sende et json_field
argument eksplicit.