De conventie die wordt geïmpliceerd uit de Django-code lijkt te zijn om null-JSON-waarden op te slaan als NULL in tegenstelling tot als een lege string (zoals de conventie is voor het CharField
). Ik zeg dit vanwege het volgende:
De empty_strings_allowed
is overgenomen van Field
in CharField
, en is ingesteld op 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
, overschrijft het echter met False
:
django/contrib/postgres/fields /jsonb.py#L13
class JSONField(Field):
empty_strings_allowed = False
...
Dit veroorzaakt CharField
's standaard op ""
en JSONField
's naar None
wanneer u een model instantieert zonder expliciet de waarden voor deze velden door te geven.
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 ""
Daarom, als u een JSONField
. wilt maken optioneel, je moet gebruiken:
json_field = JSONField(blank=True, null=True)
Als u alleen blank=True
. gebruikt , zoals u zou doen voor CharField
, krijg je een IntegrityError
bij het uitvoeren van MyModel.objects.create(...)
zonder een json_field
. door te geven argument expliciet.