[python] Django / South का उपयोग कर मॉडल का नाम बदलने का सबसे आसान तरीका?



Answers

models.py में परिवर्तन करें और फिर चलाएं

./manage.py schemamigration --auto myapp

जब आप माइग्रेशन फ़ाइल का निरीक्षण करते हैं, तो आप देखेंगे कि यह एक तालिका हटा देता है और एक नया बनाता है

class Migration(SchemaMigration):

    def forwards(self, orm):
        # Deleting model 'Foo'                                                                                                                      
        db.delete_table('myapp_foo')

        # Adding model 'Bar'                                                                                                                        
        db.create_table('myapp_bar', (
        ...
        ))
        db.send_create_signal('myapp', ['Bar'])

    def backwards(self, orm):
        ...

यह वही नहीं है जो आप चाहते हैं। इसके बजाय, माइग्रेशन को संपादित करें ताकि ऐसा लगता है:

class Migration(SchemaMigration):

    def forwards(self, orm):
        # Renaming model from 'Foo' to 'Bar'                                                                                                                      
        db.rename_table('myapp_foo', 'myapp_bar')                                                                                                                        
        if not db.dry_run:
            orm['contenttypes.contenttype'].objects.filter(
                app_label='myapp', model='foo').update(model='bar')

    def backwards(self, orm):
        # Renaming model from 'Bar' to 'Foo'                                                                                                                      
        db.rename_table('myapp_bar', 'myapp_foo')                                                                                                                        
        if not db.dry_run:
            orm['contenttypes.contenttype'].objects.filter(app_label='myapp', model='bar').update(model='foo')

update कथन की अनुपस्थिति में, db.send_create_signal कॉल नए मॉडल नाम के साथ एक नया ContentType बना देगा। लेकिन यह केवल बेहतर है कि आपके पास पहले से मौजूद सामग्री प्रकार GenericForeignKey , यदि डेटाबेस ऑब्जेक्ट्स इंगित कर रहे हैं (उदाहरण के लिए, GenericForeignKey माध्यम से)।

साथ ही, यदि आपने कुछ कॉलम का नाम बदल दिया है जो नामित मॉडल के लिए विदेशी कुंजी हैं, तो भूलना न भूलें

db.rename_column(myapp_model, foo_id, bar_id)
Question

मैं दक्षिण की साइट, Google और SO पर इसका उत्तर देने का शिकार कर रहा हूं, लेकिन ऐसा करने का एक आसान तरीका नहीं मिला।

मैं दक्षिण का उपयोग कर एक Django मॉडल का नाम बदलना चाहता हूँ। मान लें कि आपके पास निम्न है:

class Foo(models.Model):
    name = models.CharField()

class FooTwo(models.Model):
    name = models.CharField()
    foo = models.ForeignKey(Foo)

और आप फू को बार में कनवर्ट करना चाहते हैं, अर्थात्

class Bar(models.Model):
    name = models.CharField()

class FooTwo(models.Model):
    name = models.CharField()
    foo = models.ForeignKey(Bar)

इसे सरल रखने के लिए, मैं बस Foo से Bar में नाम बदलने की कोशिश कर रहा हूं, लेकिन अभी के लिए FooTwo में foo सदस्य को अनदेखा कर रहा हूं।

दक्षिण का उपयोग करके ऐसा करने का सबसे आसान तरीका क्या है?

  1. मैं शायद डेटा माइग्रेशन कर सकता हूं, लेकिन यह बहुत शामिल लगता है।
  2. एक कस्टम माइग्रेशन लिखें, उदाहरण के लिए db.rename_table('city_citystate', 'geo_citystate') , लेकिन मुझे यकीन नहीं है कि इस मामले में विदेशी कुंजी को कैसे ठीक किया जाए।
  3. एक आसान तरीका जिसे आप जानते हैं?



मैंने ऊपर लियोड के समाधान का पालन किया। लेकिन, उसने मॉडल नामों को नहीं बदला। मैंने इसे कोड में मैन्युअल रूप से बदल दिया (संबंधित मॉडल में भी जहां इसे एफके कहा जाता है)। और एक और दक्षिण प्रवासन किया, लेकिन --फेक विकल्प के साथ। यह मॉडल नाम और तालिका नाम समान होता है।

बस एहसास हुआ, कोई पहले मॉडल नाम बदलने के साथ शुरू कर सकता है, फिर उन्हें लागू करने से पहले माइग्रेशन फ़ाइल संपादित करें। बहुत साफ




Links