python - अलग-अलग शून्य=सही, खाली=django में सच है




django-models (6)

जब हम django में डेटाबेस फ़ील्ड जोड़ते हैं तो हम आम तौर पर models.CharField(max_length=100, null=True, blank=True) लिखते हैं। models.CharField(max_length=100, null=True, blank=True)DecimalField , DecimalField इत्यादि के साथ भी ऐसा ही किया जाता है। इसमें बुनियादी अंतर क्या है

  1. null=True केवल null=True
  2. blank=True केवल blank=True
  3. null=True , blank=True

अलग-अलग ( CharField , ForeignKey , CharField , DateTimeField ) फ़ील्ड के संबंध में। 1/2/3 का उपयोग करने के फायदे / नुकसान क्या हैं?


Django मॉडल परिभाषा में विकल्पों को देखते समय, यह समझना महत्वपूर्ण है कि वे (कम से कम) दो उद्देश्यों को पूरा करते हैं: डेटाबेस टेबल को परिभाषित करते हैं, और डिफ़ॉल्ट प्रारूप को परिभाषित करते हैं और मॉडल रूपों के सत्यापन को परिभाषित करते हैं। (मैं "डिफ़ॉल्ट" कहता हूं क्योंकि कस्टम प्रपत्र प्रदान करके मूल्यों को हमेशा ओवरराइड किया जा सकता है।) कुछ विकल्प डेटाबेस को प्रभावित करते हैं, कुछ विकल्प फ़ॉर्म को प्रभावित करते हैं, और कुछ दोनों को प्रभावित करते हैं।

जब यह null और blank बात आती है, तो अन्य उत्तरों पहले ही स्पष्ट कर चुके हैं कि पूर्व डेटाबेस तालिका परिभाषा को प्रभावित करता है और बाद वाला मॉडल सत्यापन को प्रभावित करता है। मुझे लगता है कि सभी चार संभावित विन्यासों के लिए उपयोग मामलों को देखकर भेद भी स्पष्ट किया जा सकता है:

  • null=False , blank=False : यह डिफ़ॉल्ट कॉन्फ़िगरेशन है और इसका मतलब है कि सभी परिस्थितियों में मान आवश्यक है।

  • null=True , blank=True : इसका मतलब है कि फ़ील्ड सभी परिस्थितियों में वैकल्पिक है। (जैसा कि नीचे बताया गया है, हालांकि, यह स्ट्रिंग-आधारित फ़ील्ड को वैकल्पिक बनाने का अनुशंसित तरीका नहीं है।)

  • null=False , blank=True : इसका मतलब है कि फ़ॉर्म को किसी मान की आवश्यकता नहीं है, लेकिन डेटाबेस करता है। इसके लिए कई उपयोग मामले हैं:

    • इस कॉन्फ़िगरेशन का सबसे आम उपयोग वैकल्पिक स्ट्रिंग-आधारित फ़ील्ड के लिए है। जैसा कि प्रलेखन में उल्लेख किया गया है , Django idiom एक लापता मान को इंगित करने के लिए खाली स्ट्रिंग का उपयोग करना है। यदि NULL को भी अनुमति दी गई थी तो आप लापता मूल्य को इंगित करने के लिए दो अलग-अलग तरीकों से समाप्त हो जाएंगे, जो आदर्श से कम होंगे।

    • एक और आम स्थिति यह है कि आप किसी अन्य के मूल्य के आधार पर स्वचालित रूप से एक फ़ील्ड की गणना करना चाहते हैं (अपनी save() विधि में, कहें)। आप नहीं चाहते कि उपयोगकर्ता किसी फॉर्म में मूल्य प्रदान करे (इसलिए blank=True ), लेकिन आप डेटाबेस को यह लागू करना चाहते हैं कि एक मान हमेशा प्रदान किया जाता है ( null=False )।

    • इस कॉन्फ़िगरेशन का एक अन्य उपयोग तब होता है जब आप यह इंगित करना चाहते हैं कि ManyToManyField वैकल्पिक है। चूंकि इस क्षेत्र को डेटाबेस कॉलम की बजाय एक अलग तालिका के रूप में कार्यान्वित किया जाता है, null शून्यहीन है । blank का मूल्य अभी भी फॉर्मों को प्रभावित करेगा, हालांकि, कोई संबंध नहीं होने पर सत्यापन सफल होगा या नहीं।

  • null=True , blank=False : इसका मतलब है कि फ़ॉर्म को एक मान की आवश्यकता है, लेकिन डेटाबेस नहीं है। यह सबसे कम इस्तेमाल किया जाने वाला कॉन्फ़िगरेशन हो सकता है, लेकिन इसके लिए कुछ उपयोग मामले हैं:

    • अपने उपयोगकर्ताओं को हमेशा एक मूल्य शामिल करने की आवश्यकता है, भले ही यह वास्तव में आपके व्यावसायिक तर्क द्वारा आवश्यक न हो। आखिरकार, फॉर्म डेटा जोड़ने और संपादित करने का एक ही तरीका है। आपके पास ऐसा कोड हो सकता है जो डेटा उत्पन्न कर रहा हो जिसके लिए एक कठोर सत्यापन की आवश्यकता नहीं है जिसे आप मानव संपादक की आवश्यकता चाहते हैं।

    • मैंने देखा है कि इसके लिए एक अन्य उपयोग केस तब होता है जब आपके पास ForeignKey है जिसके लिए आप कैस्केड हटाने की अनुमति नहीं देना चाहते हैं। यही है, सामान्य उपयोग में संबंध हमेशा वहां होना चाहिए ( blank=False ), लेकिन अगर यह इंगित होता है कि यह चीज़ हटा दी जाती है, तो आप यह ऑब्जेक्ट भी हटाना नहीं चाहते हैं। उस स्थिति में आप एक सरल प्रकार के मुलायम हटाने को लागू करने के लिए null=True और on_delete=models.SET_NULL का उपयोग कर सकते हैं।


इस प्रकार ओआरएम Django 1.8 के लिए blank और null फ़ील्ड मानचित्र करता है

class Test(models.Model):
    charNull        = models.CharField(max_length=10, null=True)
    charBlank       = models.CharField(max_length=10, blank=True)
    charNullBlank   = models.CharField(max_length=10, null=True, blank=True)

    intNull         = models.IntegerField(null=True)
    intBlank        = models.IntegerField(blank=True)
    intNullBlank    = models.IntegerField(null=True, blank=True)

    dateNull        = models.DateTimeField(null=True)
    dateBlank       = models.DateTimeField(blank=True)
    dateNullBlank   = models.DateTimeField(null=True, blank=True)        

PostgreSQL 9.4 के लिए बनाए गए डेटाबेस फ़ील्ड हैं:

CREATE TABLE Test (
  id              serial                    NOT NULL,

  "charNull"      character varying(10),
  "charBlank"     character varying(10)     NOT NULL,
  "charNullBlank" character varying(10),

  "intNull"       integer,
  "intBlank"      integer                   NOT NULL,
  "intNullBlank"  integer,

  "dateNull"      timestamp with time zone,
  "dateBlank"     timestamp with time zone  NOT NULL,
  "dateNullBlank" timestamp with time zone,
  CONSTRAINT Test_pkey PRIMARY KEY (id)
)

MySQL 5.6 के लिए बनाए गए डेटाबेस फ़ील्ड हैं:

CREATE TABLE Test (
     `id`            INT(11)     NOT  NULL    AUTO_INCREMENT,

     `charNull`      VARCHAR(10) NULL DEFAULT NULL,
     `charBlank`     VARCHAR(10) NOT  NULL,
     `charNullBlank` VARCHAR(10) NULL DEFAULT NULL,

     `intNull`       INT(11)     NULL DEFAULT NULL,
     `intBlank`      INT(11)     NOT  NULL,
     `intNullBlank`  INT(11)     NULL DEFAULT NULL,

     `dateNull`      DATETIME    NULL DEFAULT NULL,
     `dateBlank`     DATETIME    NOT  NULL,
     `dateNullBlank` DATETIME    NULL DEFAULT NULL
)

जैसा कि Django मॉडल फील्ड संदर्भ में कहा गया है: Link

फील्ड विकल्प

निम्नलिखित तर्क सभी फ़ील्ड प्रकारों के लिए उपलब्ध हैं। सभी वैकल्पिक हैं।


null

Field.null

यदि True , तो Django डेटाबेस में NULL रूप में खाली मान स्टोर करेगा। डिफ़ॉल्ट False

स्ट्रिंग-आधारित फ़ील्ड जैसे कि CharField और CharField पर null का उपयोग करने से बचें क्योंकि खाली स्ट्रिंग मान हमेशा खाली तारों के रूप में संग्रहीत किए जाएंगे, न कि पूर्ण के रूप में। यदि एक स्ट्रिंग-आधारित फ़ील्ड में null=True , तो इसका अर्थ है कि इसमें "कोई डेटा नहीं" के लिए दो संभावित मान हैं: NULL , और खाली स्ट्रिंग। ज्यादातर मामलों में, "कोई डेटा" के लिए दो संभावित मान होने के लिए अनावश्यक है; Django सम्मेलन खाली स्ट्रिंग का उपयोग करना है, न कि पूर्ण।

स्ट्रिंग-आधारित और गैर-स्ट्रिंग-आधारित दोनों फ़ील्ड के लिए, आपको blank=True सेट करने की भी आवश्यकता होगी यदि आप फ़ॉर्म में रिक्त मानों को अनुमति देना चाहते हैं, क्योंकि null पैरामीटर केवल डेटाबेस संग्रहण को प्रभावित करता है ( blank देखें)।

ध्यान दें

ओरेकल डेटाबेस बैकएंड का उपयोग करते समय, इस विशेषता के बावजूद खाली स्ट्रिंग को इंगित करने के लिए मूल्य NULL संग्रहीत किया जाएगा


blank

Field.blank

यदि True , तो फ़ील्ड को रिक्त होने की अनुमति है। डिफ़ॉल्ट False

ध्यान दें कि यह null से अलग है। null पूरी तरह डेटाबेस से संबंधित है, जबकि blank सत्यापन-संबंधित है। यदि किसी फ़ील्ड में blank=True , तो फॉर्म सत्यापन एक खाली मान की प्रविष्टि की अनुमति देगा। यदि किसी क्षेत्र में blank=False , तो फ़ील्ड की आवश्यकता होगी।


बस null=True परिभाषित डेटाबेस को NULL मानों को स्वीकार करना चाहिए, दूसरी तरफ blank=True फॉर्म फॉर्म सत्यापन पर परिभाषित करता है इस फ़ील्ड को रिक्त मान स्वीकार करना चाहिए या नहीं (यदि blank=True वह उस फ़ील्ड में किसी मान के बिना फॉर्म स्वीकार करता है और blank=False [डिफ़ॉल्ट मान ] फॉर्म सत्यापन पर यह दिखाएगा कि इस फ़ील्ड में त्रुटि की आवश्यकता है।

null=True/False डेटाबेस से संबंधित है

blank=True/False फॉर्म सत्यापन से संबंधित blank=True/False


यहां रिक्त = सत्य और शून्य = सही वर्णन = मॉडल वाले फ़ील्ड का एक उदाहरण दिया गया है। टेक्स्टफिल्ड (रिक्त = सही, शून्य = सही)

इस मामले में: खाली = सही: हमारे फॉर्म को बताता है कि विवरण फ़ील्ड को खाली छोड़ना ठीक है

तथा

शून्य = सही: हमारे डेटाबेस को बताता है कि हमारे डीबी क्षेत्र में शून्य मान रिकॉर्ड करना ठीक है और कोई त्रुटि नहीं है।


डेटाबेस कॉलम मान के लिए null है

null=True आपके डीबी में कॉलम पर null=True सेट NULL (बनाम NOT NULL )। Django फ़ील्ड प्रकारों जैसे DateTimeField या ForeignKey लिए खाली मूल्य डीबी में ForeignKey रूप में संग्रहीत किए जाएंगे।

रूपों में क्षेत्र की आवश्यकता के लिए blank है

blank=True निर्धारित करता है कि फ़ील्ड को फॉर्म में आवश्यक होगा या नहीं। इसमें व्यवस्थापक और आपके स्वयं के कस्टम रूप शामिल हैं। यदि blank=True तो फ़ील्ड की आवश्यकता नहीं होगी, जबकि यदि यह False तो फ़ील्ड खाली नहीं हो सकती है।

दोनों का कॉम्बो इतना बार होता है क्योंकि आम तौर पर यदि आप अपने फॉर्म में फ़ील्ड को खाली होने की अनुमति देने जा रहे हैं, तो आपको उस क्षेत्र के लिए NULL मानों को अनुमति देने के लिए अपने डेटाबेस की भी आवश्यकता होगी। अपवाद है CharField s और TextField s, जो Django में कभी भी पूर्ण के रूप में सहेजा नहीं जाता NULL । रिक्त मान डीबी में खाली स्ट्रिंग ( '' ) के रूप में संग्रहीत होते हैं।

कुछ उदाहरण:

models.DateTimeField(blank=True) # raises IntegrityError if blank

models.DateTimeField(null=True) # NULL allowed, but must be filled out in a form

जाहिर है कि उन दो विकल्पों का उपयोग करने के लिए तार्किक अर्थ नहीं है (हालांकि, null=True, blank=False लिए एक उपयोग केस हो सकता है यदि आप किसी फ़ील्ड को हमेशा फॉर्मों में जरूरी बनाना चाहते हैं, लेकिन किसी ऑब्जेक्ट से किसी ऑब्जेक्ट से निपटने के दौरान वैकल्पिक खोल की तरह।)

models.CharField(blank=True) # No problem, blank is stored as ''

models.CharField(null=True) # NULL allowed, but will never be set as NULL

CHAR और TEXT प्रकार को Django द्वारा NULL रूप में कभी भी सहेजा नहीं जाता NULL , इसलिए null=True अनावश्यक है। हालांकि, आप इन क्षेत्रों में से None एक को मैन्युअल रूप से सेट करने के लिए इसे लागू करने के लिए मजबूर कर सकते हैं। यदि आपके पास एक परिदृश्य है जहां यह आवश्यक हो सकता है, तो आपको अभी भी null=True शामिल करना चाहिए।





django-models