मुझे नहीं लगता कि आपको इस समस्या को ठीक करने में मदद की ज़रूरत है, जितना आपको इसे डीबग करने में मदद की ज़रूरत है। एक बार जब समस्या स्पष्ट हो जाती है, तो समाधान भी स्पष्ट हो जाता है। ट्रेसबैक शायद थोड़ा अस्पष्ट है क्योंकि यह बहुत सारे Django स्रोत कोड से गुजर रहा है और यह आपको नहीं बता रहा है कि आपके कौन से फ़ील्ड में कोई समस्या है।
इस मुद्दे की पृष्ठभूमि
सबसे पहले, हमें Post
. को सहेजने में समस्या आ रही है उदाहरण। खैर, अपनी मॉडल परिभाषा में मौजूद इन सभी क्षेत्रों को देखें:
...
url = models.URLField(max_length=250, blank=True, null=True)
video = EmbedVideoField(verbose_name='link',help_text="Youtube", blank=True, null=True)
content = RichTextUploadingField(config_name='default')
image = models.ImageField(upload_to='images',blank=True, null=True)
thumbnail = models.ImageField(upload_to='images', blank=True, null=True)
ये दिखने . नहीं हो सकते हैं टेक्स्ट फ़ील्ड, लेकिन उनमें से बहुत से टेक्स्ट फ़ील्ड पर भिन्नताएं हैं क्योंकि, यदि आप इसके बारे में सोचते हैं, तो आप शायद पूरी फ़ाइलें स्टोर नहीं करने जा रहे हैं आपके डेटाबेस में। इसके बजाय आप क्या करेंगे (और डिफ़ॉल्ट रूप से Django क्या करता है) फ़ाइल को किसी डिस्क पर कहीं संग्रहीत करता है और फिर डेटाबेस में आप पथ संग्रहीत करेंगे उस फ़ाइल के लिए ताकि आप इसे आवश्यकता पड़ने पर पुनः प्राप्त कर सकें।
इसके अलावा, डीबी में फ़ाइल-पथों को LongText
के रूप में संग्रहीत करना शायद एक बेकार है या जो भी हो, तो हर FileField
हमारे पास इसका मतलब है कि हमारे पास max_length
. के साथ एक फ़ील्ड है हम इसे निर्दिष्ट करते हैं या नहीं। इस प्रकार, उपरोक्त सभी क्षेत्रों में एक निहित max_length
है . आप वास्तव में Django स्रोत कोड पढ़कर इसका पता लगा सकते हैं।
स्रोत उदाहरण
मैंने कभी भी EmbedVideoField
का उपयोग नहीं किया है , उदाहरण के लिए, लेकिन यह निकला models.URLField
. का एक उपवर्ग
, जिसका अर्थ है कि इसमें max_length
है डिफ़ॉल्ट रूप से 200 पर सेट करेंए> यदि आप एक निर्दिष्ट नहीं करते हैं।
इसके अलावा, आपके विभिन्न ImageField
s FileField
. के केवल उपवर्ग हैं , जिसमें एक max_length
100 का डिफ़ॉल्ट
.
भविष्य में इस तरह की समस्याओं को कैसे डिबग करें?
अब, यह हमें यह जानने में मदद नहीं करता है कि कौन सा आपके क्षेत्र इस मामले में एक त्रुटि फेंक रहे हैं। उसके लिए, मैं शायद कोड में कहीं ब्रेकप्वाइंट सेट करूंगा, शायद यहां:
File "ebagu/main/models.py" in save
66. super(Post, self).save(*args, **kwargs)
"ब्रेकपॉइंट सेट करें" से मेरा मतलब निम्न से है:
ऊपर बताए गए मॉड्यूल में लाइन 65 पर जाएं, ebagu/main/models.py
और निम्नलिखित दर्ज करें और मॉड्यूल को सहेजें:import pdb; pdb.set_trace()
(मैं वास्तव में ipdb स्वयं, लेकिन इसके लिए Ipython की आवश्यकता है, जिसके लिए मेरी भी प्रबल प्राथमिकता है...)
अपना स्थानीय सर्वर चलाएँ, और इस समस्या को उत्पन्न करने वाले चरणों के माध्यम से चलाएँ। आप अपना फ़ॉर्म सबमिट करना समाप्त कर देंगे और यदि आप कंसोल को देखते हैं जहां आपने अपना सर्वर शुरू किया था, तो आपको अंततः लाइन 65 पर एक शेल में डंप किया जाएगा। यह शेल एक pdb शेल
, जिसके सामान्य शेल से भिन्न नियम हैं, लेकिन आप अपने लगभग सहेजे जाने वाले Post
का मूल्यांकन कर सकते हैं उदाहरण, इंस्टेंस पर ही विभिन्न क्षेत्रों को देखकर, self
, और उस विधि कॉल के संदर्भ में पायथन कोड चलाना:
(pdb) len(self.image.path)
इसका उपयोग करते हुए, मैं मैन्युअल रूप से विभिन्न क्षेत्रों का मूल्यांकन करूंगा और देखूंगा कि किसके पास यह वास्तव में लंबी प्रविष्टि है जो बचत को रोक रही है (शायद आपके ImageField
में से एक) एस)।
चेतावनी के साथ समाधान
वैकल्पिक रूप से, आप बस एक max_length
जोड़ सकते हैं इन सभी के लिए, लेकिन सावधान रहें कि आपको डेटाबेस माइग्रेशन करने की सबसे अधिक संभावना होगी किसी भी सीमित टेक्स्ट फ़ील्ड के लिए आप बदलते हैं क्योंकि आपका डेटाबेस अभी भी इनपुट की लंबाई को सत्यापित करने जा रहा है कि कॉलम कैसे परिभाषित किया गया है। यहाँ एक अच्छा StackOverflow उत्तर है जो वास्तव में इस समस्या को देख रहा है
।
फुटनोट
Postgresql पर स्विच करने से पहले यह क्यों नहीं आया? कई संभावित कारण हैं, लेकिन यह संभवत:पिछले डेटाबेस को कैसे सेटअप किया गया था बनाम पोस्टग्रेस्क्ल डेटाबेस कैसे सेट किया गया था (मैन्युअल रूप से बनाम Django माइग्रेशन?) के साथ करना है।
यह इस बात से भी जुड़ा हो सकता है कि आपने इन चीजों को संग्रहीत किया जा रहा है या नहीं। क्या आपने अपना MEDIA
बदल दिया है सेटिंग्स तो पथ जहां फ़ाइलें संग्रहीत की जाती हैं वे बहुत अधिक हो जाती हैं?
आपको वास्तव में जो करना चाहिए वह सीधे आपके डेटाबेस को देख रहा है। एक psql
खोलें उदाहरण के लिए और इसे आपके लिए अपनी तालिकाओं का वर्णन करने के लिए कहें। यह आपको बताएगा कि कौन से फ़ील्ड 100 वर्णों तक सीमित हैं और वे फ़ील्ड आपको समस्याएँ दे रहे हैं।