Die aus dem Django-Code implizierte Konvention scheint darin zu bestehen, Null-JSON-Werte als NULL zu speichern im Gegensatz zu einem leeren String (entsprechend der Konvention für CharField
). ). Ich sage das aus folgendem Grund:
Die empty_strings_allowed
wird von Field
geerbt in CharField
, und ist auf True
gesetzt :
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
überschreibt es jedoch mit False
:
django/contrib/postgres/fields /jsonb.py#L13
class JSONField(Field):
empty_strings_allowed = False
...
Dies verursacht CharField
ist standardmäßig ""
und JSONField
zu None
wenn Sie ein Modell instanziieren, ohne die Werte für diese Felder explizit zu übergeben.
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 ""
Wenn Sie also ein JSONField
erstellen möchten optional müssen Sie verwenden:
json_field = JSONField(blank=True, null=True)
Wenn Sie nur blank=True
verwenden , wie Sie es für CharField
tun würden , erhalten Sie einen IntegrityError
beim Versuch, MyModel.objects.create(...)
auszuführen ohne ein json_field
zu übergeben Argument explizit.