Quy ước được ngụ ý từ mã Django dường như là lưu trữ các giá trị JSON rỗng dưới dạng NULL trái ngược với một chuỗi trống (như quy ước cho CharField
). Tôi nói điều này vì những điều sau:
empty_strings_allowed
được kế thừa từ Field
trong CharField
và được đặt thành True
:
django / db / models / fields /__init__.py#L96
Trường lớpclass Field(RegisterLookupMixin):
"""Base class for all field types"""
# Designates whether empty strings fundamentally are allowed at the
# database level.
empty_strings_allowed = True
...
JSONField
tuy nhiên, ghi đè nó bằng False
:
django / Contrib / postgres / fields /jsonb.py#L13
class JSONField(Field):
empty_strings_allowed = False
...
Điều này gây ra CharField
được để mặc định thành ""
và JSONField
của None
khi bạn khởi tạo một mô hình mà không chuyển các giá trị cho các trường này một cách rõ ràng.
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 ""
Do đó, nếu bạn muốn tạo JSONField
tùy chọn, bạn phải sử dụng:
json_field = JSONField(blank=True, null=True)
Nếu bạn chỉ sử dụng blank=True
, như bạn làm đối với CharField
, bạn sẽ nhận được một IntegrityError
khi cố gắng chạy MyModel.objects.create(...)
mà không cần chuyển json_field
đối số rõ ràng.