2010-08-14 10 views
13

एक सरल charfield आदि का नाम बदल रहा लगता है आसान (Django - How to rename a model field using South?)दक्षिण के साथ एक विदेशी क्षेत्र का नाम कैसे बदलें?

हालांकि जब मैं एक ForeignKey मैदान पर एक ही उपयोग करने का प्रयास करने पर मुझे त्रुटि मिलती है:

_mysql_exceptions.OperationalError: (1091, "Can't DROP '[new_fkey_field_name]'; check that column/key exists") 

कौन सा प्रवास की वजह से उपजी पीछे की ओर भागने की कोशिश कर किसी कारण से (जैसा कि ट्रेस में प्रमाणित है)।

कोई भी विचार?

+0

ऐसा लगता है कि समस्या MySQL पक्ष पर है। - आपने किस स्टोरेज इंजन का उपयोग किया था? - क्या आप माईसाम का उपयोग करते हैं (जो संदर्भित अखंडता का समर्थन नहीं करता है)? - क्या आपने इसे postgresql के sqlite के साथ आजमाया था? –

+0

इसी तरह का सवाल यहां: http: // stackoverflow।कॉम/प्रश्न/160012 9/उपयोग-दक्षिण-से-रिफैक्टर-ए-डीजेंगो-मॉडल-उत्तराधिकारी –

उत्तर

4

अद्यतन:वैकल्पिक हल 3 चरणों में प्रवास का संचालन करने के लिए है :

: mysql-5.5.30-1.fc18.x86_64 और

MySQL-python==1.2.4 
Django==1.4.2 
South==0.7.6 

निम्नलिखित कार्यों के साथ

class Migration(SchemaMigration_: 
    def forwards(self, orm): 
     db.rename_column('app_model', 'old_id', 'new_id') 
     db.alter_column('app_model', 'new_id', 
         self.gf('django.db.models.fields.related.ForeignKey')(
          blank=True, 
          null=True, 
          to=orm['app.OtherModel'] 
         )) 

    def backwards(self, orm): 
     db.rename_column('app_model', 'new_id', 'old_id') 
     db.alter_column('app_model', 'old_id', 
         self.gf('django.db.models.fields.related.ForeignKey')(
          blank=True, 
          null=True, 
          to=orm['app.OtherModel'] 
         )) 

@ एलोफ टिप्पणियों के रूप में, दक्षिण अज्ञात कारणों से मूल एफके नहीं ढूंढ सकता है, लेकिन यह कोई फर्क नहीं पड़ता। डेटा माइग्रेशन (मुझे विश्वास है) की कोई आवश्यकता नहीं है क्योंकि पीके मानों को नहीं बदला जाना चाहिए।

फ़ील्ड विनिर्देश (self.gf का उपयोग करके) स्थिरता के लिए दक्षिण के स्वत: जेनरेट किए गए माइग्रेशन से लिया जाता है।

+1

के साथ विश्वसनीय रूप से काम करता है यदि आप इस समाधान का उपयोग करते हैं तो आप [इस छोटे साउथ बग] (http://south.aeracode.org/ticket/1186) द्वारा काट सकते हैं। या तो बंदर-पैच दक्षिण (टिकट देखें) या रिश्वत [एंड्रयू] (http://aeracode.org) इसे ठीक करने के लिए – supervacuo

6

ForeignKey का नाम बदलने पर, क्षेत्र नाम के अंत में _id जोड़ने के लिए याद रखें जो आप Django में उपयोग करते हैं। जैसे

db.rename_column('accounts_transaction', 'operator_id', 'responsible_id') 

और न

db.rename_column('accounts_transaction', 'operator', 'responsible') 

लेकिन मैं केवल SQLite पर इस परीक्षण किया है (जो वास्तव में ALTER_TABLE बिल्कुल नहीं है), तो मैं पता लगाएं कि क्या mysql पर काम करेंगे पता नहीं है/postgres।

24

सबसे पहले, आपको मॉडल में डीबी कॉलम नाम का उपयोग करने की आवश्यकता नहीं है। उदाहरण: foobar_id foobar नहीं है।

तो फिर तुम FK बाधाओं ड्रॉप और नाम के बाद उन्हें फिर से बनाना चाहिए:

db.drop_foreign_key('app_model', 'old_id') 
db.rename_column('app_model', 'old_id', 'new_id') 
db.alter_column('app_model', 'new_id', models.ForeignKey(to=orm['app.OtherModel'])) 

यदि आपका FK नल आप के लिए इसे बदल उपयोग करने की आवश्यकता है:

db.alter_column('app_model', 'new_id', models.ForeignKey(null=True, to=orm['app.OtherModel'])) 
+1

यह MySQL 5.5.13 (दक्षिण 0.7.3) ड्रॉप_foreign_key के साथ काम नहीं करता है, विदेशी कुंजी बाधा नहीं पाती है। – Eloff

+0

alter_column() को 'new_id' का उपयोग नहीं करना चाहिए? – del

+0

अगर एफके नामुमकिन है तो डीबग करना वाकई मुश्किल है। धन्यवाद आदमी –

11

MySQL उपयोगकर्ताओं होना चाहिए दक्षिण में इस बग के बारे में पता है, तो वास्तव में यह अभी भी लागू होता है:

http://south.aeracode.org/ticket/697

1) नई फ़ील्ड जोड़ें

2) डेटा नए क्षेत्र

3) करने के लिए डेटा को स्थानांतरित वर्ष क्षेत्र को नष्ट

+0

आईएमएचओ, यह एकमात्र समाधान है जो MySQL डीबी –

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