2011-02-16 8 views
8

जैसा कि मैं this database design question से समझता हूं, आपको कमजोर फ़ील्ड का उपयोग कम से कम करना चाहिए और इसके बजाए डेटा डिज़ाइन पर पुनर्विचार करना बेहतर होगा या नहीं।Django मॉडल में Nullable TextField या खाली स्ट्रिंग?

लेकिन मान लें कि किसी विशेष मामले में संकल्प एक टेक्स्ट फ़ील्ड को खाली मान रखने की अनुमति देना है। कहें, user तालिका है और short_bio कॉलम है जो Django में TextField द्वारा दर्शाया गया है और यह अनिवार्य नहीं है। अलग user_bio तालिका बनाने के लिए यह समझ में नहीं आता है, है ना?

अब सवाल है, खाली मान खाली स्ट्रिंग या शून्य मार्कर होना चाहिए? प्रत्येक विकल्प के लिए पेशेवर और विपक्ष क्या हैं? क्या Django डेटाबेस के साथ काम करता है कि कैसे अंतर कर सकते हैं में कोई विशिष्टता है?


यह ध्यान देने योग्य है कि django-lint वर्तमान में null=True साथ CharField और TextField उदाहरणों पर रिपोर्ट।

इसके विपरीत, 'some developers द्वारा रिक्त छोड़े गए फ़ील्ड के लिए खाली स्ट्रिंग को संग्रहीत करना एक बुरा विचार के रूप में देखा जाता है।

उत्तर

16

मुझे लगता है कि जब 'खाली स्ट्रिंग' का अर्थ 'कोई मान' नहीं है, तो रिक्त स्ट्रिंग का उपयोग नल और रिक्त स्थान को मिश्रण करने से बचने के लिए किया जाना चाहिए (उदाहरण के लिए खोज या तुलना में: कुछ डीबीएमएस में आप नहीं कर सकते NULL से NULL की तुलना सीधे करें, आपको IS NULL ऑपरेटर का उपयोग करना होगा)।

रिक्त स्ट्रिंग का उपयोग करना रिपोर्ट और अन्य सामानों में 'जैसा है' का उपयोग करना आसान बनाता है, जहां 'short_bio' का उपयोग डीओएम (उदाहरण के लिए objects.values('short_bio')) का उपयोग किए बिना किया जाता है, बिना शून्य में कनवर्ट किए।

इसके अलावा, Django docs राज्य:

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

+2

तर्क और उल्लेख Django सम्मेलन के लिए धन्यवाद जो मैं डॉक्स में नोटिस करने में विफल रहा। – Tony

5

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

Django हमेशा अद्वितीय मूल्यों के रूप में NULL को देखता है, इस बीच खाली स्ट्रिंग हमेशा एक और खाली स्ट्रिंग के बराबर होती है। Unique fields that allow nulls in Django और ticket 9039 देखें।

'दोनों दुनिया के सर्वश्रेष्ठ' होने के लिए आप खाली मान को न्यूल के रूप में संग्रहीत कर सकते हैं, लेकिन कस्टम फॉर्म फ़ील्ड के माध्यम से खाली स्ट्रिंग के रूप में प्रदर्शित कर सकते हैं। ए (नहीं परीक्षण किया) उदाहरण by mightyhal:

from django.db import models 


class CharNullField(models.CharField): 
    description = "Stores NULL but returns empty string" 
    def to_python(self, value): 
     # this may be the value right out of the db, or an instance 
     if isinstance(value, models.CharField): 
      # if an instance, return the instance 
      return value 
     if value == None: 
      # if db has NULL (==None in Python), return empty string 
      return "" 
     else: 
      return value # otherwise, return just the value 
    def get_db_prep_value(self, value): 
     # catches value right before sending to db 
     if value == "": 
      # if Django tries to save an empty string, send to db None (NULL) 
      return None 
     else: 
      return value # otherwise, just pass the value 
संबंधित मुद्दे