2011-09-08 16 views
187

Django में CharField() और TextField() के बीच क्या अंतर है? documentation का कहना है कि CharField() छोटे तारों के लिए उपयोग किया जाना चाहिए और TextField() बड़े तारों के लिए उपयोग किया जाना चाहिए। ठीक है, लेकिन "छोटे" और "बड़े" के बीच खींची गई रेखा कहां है? यहां हुड के नीचे क्या चल रहा है जो इस मामले को बनाता है?Django CharField बनाम TextField

उत्तर

214

यह आरडीबीएमएस के varchar (या समान) के बीच एक अंतर है - आमतौर पर उन्हें अधिकतम लंबाई के साथ निर्दिष्ट किया जाता है, और प्रदर्शन या भंडारण के मामले में अधिक कुशल हो सकता है - और text (या समान) प्रकार - आमतौर पर केवल सीमित होते हैं हार्डकोडेड कार्यान्वयन सीमा (डीबी स्कीमा नहीं)।

PostgreSQL 9, विशेष रूप से, "There is no performance difference among these three types" बताता है, लेकिन AFAIK में कुछ अंतर हैं उदा। MySQL, तो यह ध्यान में रखना कुछ है।

अंगूठे का एक अच्छा नियम यह है कि आप अधिकतम लंबाई, TextField को सीमित करने की आवश्यकता होने पर CharField का उपयोग करते हैं।

यह वास्तव में Django- विशिष्ट भी नहीं है।

+24

और इसके विपरीत, यदि आप चारफ़ील्ड का उपयोग करते हैं तो आपको * अधिकतम लंबाई –

+10

होनी चाहिए मुझे पता चला है कि डिफ़ॉल्ट रूप से 'टेक्स्टफ़िल्ल्ड' का उपयोग करके आपके ऐप की पोर्टेबिलिटी प्रभावित हो सकती है। पोस्टग्रेज़ पर प्रदर्शन हिट नहीं हो सकता है, लेकिन ओरेकल इसे 'सीएलओबी' के रूप में स्टोर करेगा, जिसमें कुछ परेशानियां हैं, जैसे कि WHERE कथन में फ़ील्ड का उपयोग करने में सक्षम नहीं है। बस कुछ विचार करने के लिए। – Rob

+1

किसी को भी यह मानना ​​चाहिए कि ओरेकल 'चारफ़िल्ल्ड' में 2000 से अधिक 'max_length' नहीं हो सकता है, या यह' ओआरए -00 9 10: निर्दिष्ट डेटा लंबाई के लिए निर्दिष्ट लम्बाई 'जारी करता है। – Dinei

22

कुछ मामलों में यह क्षेत्र के उपयोग के तरीके से जुड़ा हुआ है। कुछ डीबी इंजनों में फ़ील्ड अंतर निर्धारित करते हैं कि कैसे (और यदि) आप फ़ील्ड में टेक्स्ट की खोज करते हैं। CharFields आमतौर पर उन चीजों के लिए उपयोग किया जाता है जो खोजने योग्य हैं, जैसे कि आप "एक प्लस दो" स्ट्रिंग में "एक" खोजना चाहते हैं। चूंकि तार कम होते हैं क्योंकि इंजन के माध्यम से खोज करने में वे कम समय लेते हैं। टेक्स्टफिल्ड्स आमतौर पर खोज के लिए नहीं होते हैं (जैसे कि ब्लॉग का शरीर) लेकिन टेक्स्ट के बड़े हिस्से को पकड़ने के लिए हैं। अब यह अधिकांश डीबी इंजन पर निर्भर करता है और पोस्टग्रेस की तरह इससे कोई फर्क नहीं पड़ता।

यदि आप कोई फर्क नहीं पड़ता है, तो यदि आप मॉडलफॉर्म का उपयोग करते हैं तो आपको फॉर्म में एक अलग प्रकार का संपादन फ़ील्ड मिलता है। मॉडलफॉर्म एक HTML फॉर्म को टेक्स्टफिल्ड के लिए चारफिल्ड और मल्टीलाइन के लिए टेक्स्ट की एक पंक्ति का आकार देगा।

3

उदाहरण के लिए,। 2 क्षेत्रों नीचे की तरह एक मॉडल में जुड़ जाते हैं ..

description = models.TextField(blank=True, null=True) 
title = models.CharField(max_length=64, blank=True, null=True) 

नीचे जब माइग्रेशन लागू होते हैं मार डाला mysql क्वेरी दी गई हैं।

TextField (विवरण) क्षेत्र के लिए

के रूप में परिभाषित किया गया है एक CharField (शीर्षक) MAX_LENGTH (अपेक्षित) varchar(64)

ALTER TABLE `sometable_sometable` ADD COLUMN `title` varchar(64) NULL; 
ALTER TABLE `sometable_sometable` ALTER COLUMN `title` DROP DEFAULT; 
0

के रूप में परिभाषित किया गया है के लिए longtext

ALTER TABLE `sometable_sometable` ADD COLUMN `description` longtext NULL; 

CharField 255 अक्षरों की MAX_LENGTH है जबकि टेक्स्टफिल्ड 255 से अधिक वर्ण रख सकता है। जब आपके पास इनपुट के रूप में बड़ी स्ट्रिंग होती है तो टेक्स्टफ़ील्ड का उपयोग करें। यह जानना अच्छा होता है कि जब max_length पैरामीटर को टेक्स्टफ़िल्ल्ड में पास किया जाता है तो यह टेक्स्टएरिया विजेट की लंबाई सत्यापन को पास करता है।

संबंधित मुद्दे