Wygląda na to, że konwencja wynikająca z kodu Django polega na przechowywaniu pustych wartości JSON jako NULL w przeciwieństwie do pustego ciągu (jak jest w konwencji dla CharField
). Mówię to z następujących powodów:
empty_strings_allowed
jest dziedziczony z Field
w CharField
i jest ustawiony na 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
, jednak zastępuje go False
:
django/contrib/postgres/fields /jsonb.py#L13
class JSONField(Field):
empty_strings_allowed = False
...
To powoduje, że CharField
Domyślnie ma wartość ""
i JSONField
s na None
kiedy tworzysz instancję modelu bez jawnego przekazywania wartości dla tych pól.
django/db /models/fields/początek .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 ""
Dlatego jeśli chcesz utworzyć JSONField
opcjonalnie, musisz użyć:
json_field = JSONField(blank=True, null=True)
Jeśli używasz tylko blank=True
, tak jak w przypadku CharField
, otrzymasz IntegrityError
podczas próby uruchomienia MyModel.objects.create(...)
bez przekazywania json_field
argument jawnie.