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.