Django कोड से निहित सम्मेलन शून्य JSON मानों को NULL के रूप में संग्रहीत करने के लिए प्रतीत होता है एक खाली स्ट्रिंग के विपरीत (जैसा कि CharField
. के लिए सम्मेलन है) ) मैं निम्नलिखित के कारण ऐसा कह रहा हूं:
empty_strings_allowed
Field
. से इनहेरिट किया गया है CharField
. में , और 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
, हालांकि, इसे False
. से ओवरराइड करता है :
django/contrib/postgres/fields /jsonb.py#L13
class JSONField(Field):
empty_strings_allowed = False
...
यह CharField
. का कारण बनता है डिफ़ॉल्ट रूप से ""
. है और JSONField
से None
जब आप इन क्षेत्रों के मूल्यों को स्पष्ट रूप से पारित किए बिना किसी मॉडल को तुरंत चालू करते हैं।
django/db /मॉडल/फ़ील्ड/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 ""
इसलिए, यदि आप एक JSONField
बनाना चाहते हैं वैकल्पिक, आपको उपयोग करना होगा:
json_field = JSONField(blank=True, null=True)
यदि आप केवल blank=True
का उपयोग करते हैं , जैसा कि आप CharField
. के लिए करेंगे , आपको एक IntegrityError
मिलेगा MyModel.objects.create(...)
run चलाने का प्रयास करते समय json_field
passing पास किए बिना स्पष्ट रूप से तर्क।