2011-09-20 13 views
5

मैं एक php ऐप से एक नया Django प्रोजेक्ट में एक MySQL डेटाबेस को एकीकृत कर रहा हूं। Inspectdb अच्छी तरह से काम किया, मुझे सिर्फ कुछ क्षेत्रों को विदेशी के लिए बदलना पड़ा और अब सभी पढ़ने और संपादन वर्तमान डेटा बहुत अच्छा काम कर रहा है।डीजेगो - विरासत डीबी और 'आईडी' फ़ील्ड के साथ समस्याएं

समस्या तब होती है जब मैं एक नई प्रविष्टि बनाने का प्रयास करता हूं, मुझे त्रुटि "Field 'id' doesn't have a default value" मिलता है। ट्रेसबैक form.save() कॉल से शुरू होता है और अपवाद MySQL कर्सर से आ रहा है। ज्यादातर मामलों में स्तंभ id नाम पर है, लेकिन एक मामले में यह एक नामित मूल्य है:

class ModelOne(models.Model): #normal "id" named pk 
    id = models.AutoField(primary_key=True, db_column='id', default=None) 
    other_fields = ... 

class ModelTwo(models.Model): #specific pk 
    named_pk = models.AutoField(primary_key=True, db_column='named_pk', 
           default=None) 
    other_fields = ... 

ModelTwo के लिए, जब मैं एक मान्य फ़ॉर्म पोस्ट, मैं त्रुटि मिलती है, लेकिन फिर अगर मैं अपने डेटा की सूची पर वापस जाने के लिए , नया आइटम दिखाता है! और जब मैंने खोल में नवीनतम id मानों की जांच की, तो मैं देख सकता हूं कि वे सही ढंग से बढ़ रहे हैं।

लेकिन मॉडलऑन के लिए (केवल id के साथ), त्रुटि अभी भी दिखाई देती है, और पीके 2147483647 (अधिकतम) बन जाता है और बाद में बचाता है डुप्लिकेट आईडी के कारण विफल रहता है। (अगला उच्चतम पीके केवल 62158 है)

इन आईडी फ़ील्ड को सही ढंग से काम करने के लिए मुझे क्या करने की आवश्यकता है?


अपडेट: अभी भी कोई फिक्सिंग इसे ठीक नहीं कर रहा है। डेटा को डंप करने और इसे ताजा, डीजेगो-निर्मित टेबल में आयात करने के बारे में सोचते हुए। अभी भी इस समस्या का हल ढूंढ रहे हैं।


Update2: db खोल से जानकारी

ModelOne:

+-------------+--------------+-------+------+---------+-----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 

ModelTwo:

+-------------+--------------+-------+------+---------+-----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
| named_pk | int(11)  | NO | PRI | NULL | auto_increment | 
+0

अगर आप 'डिफ़ॉल्ट हटाने पर क्या होता है = कोई नहीं '? –

+0

@ डैनियल रोज़मन - एक ही सटीक बात। मैंने इसे केवल –

उत्तर

1

के लिए ModelTwo के लिए डेटाबेस मैं मूल डेटाबेस से डेटा निर्यात समाप्त हो गया से, और यह एक ताजा db में लोड जो मेरे मॉडल/परियोजना द्वारा उत्पन्न किया गया था।

मुझे लगता है कि मैंने मूल डेटाबेस की प्रतिलिपि के साथ बहुत सी चीजों की कोशिश की थी और मैं पीके क्षेत्र के लिए अंतर्निहित एसक्यूएल को बॉट किया था।

मुझे खुशी है कि मैं केवल एक प्रति के साथ काम कर रहा था।

+0

वही बात मेरे साथ हुई, वही फिक्स। डेटा निर्यात, फिर टेबलों के मनोरंजन ने डीजेंगो को mysql में नए पीके की पीढ़ी को सही ढंग से प्रस्तुत करने के लिए MySQL ऑटो-वृद्धि विशेषता को स्थापित करने की अनुमति दी। – hobs

3

यह (के रूप में अपने पहले से ही कर रहे हैं समझ में आता है ModelTwo के लिए pk परिभाषित करने के लिए) क्योंकि आपके पीके के पास अलग-अलग नाम 'name_pk' है। हालांकि, मॉडलऑन के लिए अपने पीके के रूप में स्पष्ट रूप से 'आईडी' को परिभाषित करने की आवश्यकता नहीं है। Django डिफ़ॉल्ट रूप से आईडी कॉलम बना देगा। तो मॉडलऑन के लिए आईडी कॉलम को बिल्कुल परिभाषित न करें।

अद्यतन: निकालें "डिफ़ॉल्ट = कोई नहीं" मॉडल और डिफ़ॉल्ट शून्य से named_pk

+0

पर इंगित करने की तरह लग रहा था जैसे सीधे यह पता लगाने के प्रयास में जोड़ा कि मैंने इस दृष्टिकोण को भी आजमाया है। अगर मैं एसक्यूएल में जाता हूं और सक्षम संरचना को देखता हूं तो पहले से ही 'id' कॉलम auto_increment पर सेट है। मुझे लगता है कि समस्या यह पहचानने वाले Django में निहित है। क्या कोई विचार है कि मॉडल वास्तव में डेटा को सही तरीके से सहेजने के बावजूद त्रुटि क्या हो रही है? –

+0

मैंने अपना प्रश्न अपडेट किया है ताकि MySQL आउटपुट को 'SHOW COLUMNS से ​​table_name' से दिखाया जा सके। मैं जो कह रहा हूं उसका काफी पालन नहीं करता हूं, मॉडलटवो में 'आईडी' नामक कोई कॉलम नहीं है। फ़ील्ड 'name_pk' हमेशा पीके कॉलम रहा है। उस मॉडल के लिए, 'name_pk' का वास्तविक मान बहुत महत्वपूर्ण है (यह क्रय सिस्टम में क्रमिक क्रम संख्या से संबंधित है)। –

+0

यदि ModelTwo तालिका में कोई 'आईडी' कॉलम नहीं है, तो ModelTwo को सहेजते समय त्रुटि क्या होती है? –

5

मैं कुछ जटिल दक्षिण प्रवासन के बाद एक ही मुद्दे से मुलाकात की। हम डेटाबेस को पुनः लोड करने से बचाना चाहते थे (डंप/आयात), सौभाग्य से यह उसी मुद्दे की खोज के बाद इस पोस्ट पर आने वाले अन्य लोगों की सहायता करेगा।

हमें एक समाधान मिला जो डेटाबेस को निर्यात और आयात करने की आवश्यकता के बिना इस समस्या को हल करता है।

एक मेज नामित auth_user के लिए, निम्न MySQL आदेश ऊपर त्रुटि संदेश फ़िक्से देगा:

ALTER TABLE auth_user MODIFY `id` INT(11) NOT NULL AUTO_INCREMENT; 

से मूल समाधान:

http://webit.ca/2012/01/field-id-doesnt-have-a-default-value/

+0

+1 यह मेरे लिए काम किया। –

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