मॉडल और रिलेशनशिप फ़ील्ड का नाम बदलने के लिए Django माइग्रेशन रणनीति


152

मैं एक मौजूदा Django परियोजना में कई मॉडल का नाम बदलने की योजना बना रहा हूं जहां कई अन्य मॉडल हैं जिनके मॉडल का विदेशी प्रमुख संबंध हैं मैं नाम बदलना चाहूंगा। मुझे पूरा यकीन है कि इसके लिए कई पलायन की आवश्यकता होगी, लेकिन मैं सटीक प्रक्रिया के बारे में सुनिश्चित नहीं हूं।

मान लीजिए कि मैं एक Django ऐप के भीतर निम्नलिखित मॉडलों के साथ शुरू करता हूं जिसे कहा जाता है myapp:

class Foo(models.Model):
    name = models.CharField(unique=True, max_length=32)
    description = models.TextField(null=True, blank=True)


class AnotherModel(models.Model):
    foo = models.ForeignKey(Foo)
    is_awesome = models.BooleanField()


class YetAnotherModel(models.Model):
    foo = models.ForeignKey(Foo)
    is_ridonkulous = models.BooleanField()

मैं Fooमॉडल का नाम बदलना चाहता हूं क्योंकि नाम वास्तव में कोई मतलब नहीं है और कोड में भ्रम पैदा कर रहा है, और Barबहुत स्पष्ट नाम के लिए बना देगा।

मैंने जो कुछ Django विकास प्रलेखन में पढ़ा है, मैं निम्नलिखित प्रवासन रणनीति मान रहा हूं:

चरण 1

संशोधित करें models.py:

class Bar(models.Model):  # <-- changed model name
    name = models.CharField(unique=True, max_length=32)
    description = models.TextField(null=True, blank=True)


class AnotherModel(models.Model):
    foo = models.ForeignKey(Bar)  # <-- changed relation, but not field name
    is_awesome = models.BooleanField()


class YetAnotherModel(models.Model):
    foo = models.ForeignKey(Bar)  # <-- changed relation, but not field name
    is_ridonkulous = models.BooleanField()

ध्यान दें कि AnotherModelफ़ील्ड का नाम fooनहीं बदलता है, लेकिन संबंध Barमॉडल के लिए अपडेट किया गया है। मेरा तर्क यह है कि मुझे एक बार में बहुत अधिक परिवर्तन नहीं करना चाहिए और अगर मैंने इस फ़ील्ड का नाम बदल दिया है तो मुझे barउस कॉलम में डेटा खोने का जोखिम होगा।

चरण 2

एक खाली माइग्रेशन बनाएँ:

python manage.py makemigrations --empty myapp

चरण 3

संचालन सूची में ऑपरेशन Migrationको जोड़ने के लिए चरण 2 में बनाई गई माइग्रेशन फ़ाइल में कक्षा को संपादित करें RenameModel:

class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0001_initial'),
    ]

    operations = [
        migrations.RenameModel('Foo', 'Bar')
    ]

चरण 4

माइग्रेशन लागू करें:

python manage.py migrate

चरण 5

संबंधित फ़ील्ड नामों को इसमें संपादित करें models.py:

class Bar(models.Model):
    name = models.CharField(unique=True, max_length=32)
    description = models.TextField(null=True, blank=True)


class AnotherModel(models.Model):
    bar = models.ForeignKey(Bar)  # <-- changed field name
    is_awesome = models.BooleanField()


class YetAnotherModel(models.Model):
    bar = models.ForeignKey(Bar)  # <-- changed field name
    is_ridonkulous = models.BooleanField()

चरण 6

एक और खाली प्रवास बनाएँ:

python manage.py makemigrations --empty myapp

चरण 7

संचालन सूची में किसी भी संबंधित क्षेत्र के नाम के लिए ऑपरेशन (ओं) Migrationको जोड़ने के लिए चरण 6 में बनाई गई माइग्रेशन फ़ाइल में कक्षा को संपादित करें RenameField:

class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0002_rename_fields'),  # <-- is this okay?
    ]

    operations = [
        migrations.RenameField('AnotherModel', 'foo', 'bar'),
        migrations.RenameField('YetAnotherModel', 'foo', 'bar')
    ]

चरण 8

दूसरा माइग्रेशन लागू करें:

python manage.py migrate

नए चर नामों को प्रतिबिंबित करने के लिए बाकी कोड (विचार, रूप, आदि) को अपडेट करने के अलावा, क्या यह मूल रूप से नया माइग्रेशन कार्यक्षमता काम करेगा?

इसके अलावा, यह कई चरणों की तरह लगता है। क्या प्रवास के संचालन को किसी तरह से संघनित किया जा सकता है?

धन्यवाद!

जवाबों:


126

इसलिए जब मैंने यह कोशिश की, तो ऐसा लगता है कि आप चरण 3 - 7 को संघनित कर सकते हैं:

class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0001_initial'), 
    ]

    operations = [
        migrations.RenameModel('Foo', 'Bar'),
        migrations.RenameField('AnotherModel', 'foo', 'bar'),
        migrations.RenameField('YetAnotherModel', 'foo', 'bar')
    ]

यदि आप उन नामों को अपडेट नहीं करते हैं, जहां यह आयात किया गया है, जैसे कि admin.py और यहां तक ​​कि पुरानी माइग्रेशन फ़ाइलें (!)।

अपडेट : जैसा कि सेसरो उल्लेख करता है, Django के नए संस्करण आमतौर पर पता लगाने और पूछने में सक्षम होते हैं कि क्या एक मॉडल का नाम बदला गया है। इसलिए manage.py makemigrationsपहले प्रयास करें और फिर माइग्रेशन फ़ाइल जांचें।


जवाब के लिए धन्यवाद। जब से मैंने उल्लिखित चरणों का उपयोग करके माइग्रेट किया है, लेकिन मैं उत्सुक हूं कि क्या आपने मौजूदा डेटा के साथ या केवल खाली डेटाबेस के साथ ऐसा करने की कोशिश की है?
फाइवर

2
मौजूदा डेटा के साथ इसकी कोशिश की, अपने स्थानीय env में sqlite पर बस कुछ पंक्तियों के बावजूद (जब मैं उत्पादन के लिए स्थानांतरित करता हूं, तो मैं सब कुछ मिटा देने का इरादा रखता हूं। प्रवास की फाइलें)
wasabigeek

4
यदि आप apps.get_modelउनमें उपयोग करते हैं तो आपको माइग्रेशन फ़ाइलों में मॉडल का नाम नहीं बदलना होगा। मुझे यह पता लगाने में बहुत समय लगा।
अहमद

9
Django 2.0 में यदि आप अपना मॉडल नाम बदलते हैं, तो ./manage.py makemigrations myappकमांड आपसे पूछेगा कि क्या आपने अपना मॉडल बदला है। उदाहरण: क्या आपने बार-बार myapp.Foo मॉडल का नाम बदला? [y / N] यदि आप 'y' का उत्तर देते हैं, तो आपके प्रवास में migration.RenameModel('Foo', 'Bar')
नामांकित

1
manage.py makemigrations myappअभी भी विफल हो सकता है: "यदि आपने मॉडल का नाम और इसके कुछ क्षेत्रों को एक साथ ऑटोडेटेक्टर में बदल दिया है, तो आपको इसे मैन्युअल रूप से जोड़ना पड़ सकता है; यह ऐसा लगेगा जैसे आपने पुराने नाम के साथ एक मॉडल को हटा दिया और एक नया जोड़ा। एक अलग नाम, और यह जो माइग्रेशन बनाता है वह पुरानी तालिका के किसी भी डेटा को खो देगा। " Django 2.1 डॉक्स मेरे लिए, खाली माइग्रेशन बनाने के लिए पर्याप्त था, मॉडल का नाम इसमें जोड़ें, फिर makemigrationsहमेशा की तरह चलाएं ।
hlongmore

36

सबसे पहले, मैंने सोचा था कि फ़िएवर की विधि ने मेरे लिए काम किया क्योंकि माइग्रेशन ने चरण 4 तक अच्छी तरह से काम किया। हालांकि, 'विदेशीकेफिल्ड (बार)' में निहित 'विदेशीकेफिल्ड (फू)' परिवर्तन किसी भी माइग्रेशन से संबंधित नहीं था। जब मैं रिलेशनशिप फील्ड (चरण 5-8) का नाम बदलना चाहता था तो यह प्रवासन विफल हो गया। यह इस तथ्य के कारण हो सकता है कि मेरे मामले में अन्य ऐप्स में मेरा 'अन्यमॉडल' और 'येटऑनथेरमॉडल' भेजे गए हैं।

इसलिए मैं नीचे दिए गए चरणों के अनुसार अपने मॉडल और रिलेशनशिप फ़ील्ड का नाम बदलने में कामयाब रहा:

मैंने इस से विधि को अनुकूलित किया और विशेष रूप से ओट्रानज़र की चाल।

तो Fiver की तरह मान लें कि हमारे पास myapp में है :

class Foo(models.Model):
    name = models.CharField(unique=True, max_length=32)
    description = models.TextField(null=True, blank=True)

और मायोथेरेप में :

class AnotherModel(models.Model):
    foo = models.ForeignKey(Foo)
    is_awesome = models.BooleanField()


class YetAnotherModel(models.Model):
    foo = models.ForeignKey(Foo)
    is_ridonkulous = models.BooleanField()

चरण 1:

हर OneToOneField (Foo) या ForeignKeyField (Foo) को IntegerField () में बदलना। (यह संबंधित Foo ऑब्जेक्ट के पूर्णांक के मान के रूप में रखेगा)।

class AnotherModel(models.Model):
    foo = models.IntegerField()
    is_awesome = models.BooleanField()

class YetAnotherModel(models.Model):
    foo = models.IntegerField()
    is_ridonkulous = models.BooleanField()

फिर

python manage.py makemigrations

python manage.py migrate

चरण 2: (Fiver से चरण 2-4 की तरह)

मॉडल का नाम बदलें

class Bar(models.Model):  # <-- changed model name
    name = models.CharField(unique=True, max_length=32)
    description = models.TextField(null=True, blank=True)

एक खाली माइग्रेशन बनाएँ:

python manage.py makemigrations --empty myapp

फिर इसे इस तरह संपादित करें:

class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '0001_initial'),
    ]

    operations = [
        migrations.RenameModel('Foo', 'Bar')
    ]

आखिरकार

python manage.py migrate

चरण 3:

अपने पिछले फॉरेनकेयफील्ड या OneToOneField में लेकिन नए बार मॉडल के साथ अपने इंटेगरफिल्ड को वापस ट्रांसफ़ॉर्म करें। (पिछला पूर्णांक फ़ील्ड आईडी को संग्रहीत कर रहा था, इसलिए django समझे और कनेक्शन को पुन: स्थापित करें, जो अच्छा है।)

class AnotherModel(models.Model):
    foo = models.ForeignKey(Bar)
    is_awesome = models.BooleanField()

class YetAnotherModel(models.Model):
    foo = models.ForeignKey(Bar)
    is_ridonkulous = models.BooleanField()

फिर करो:

python manage.py makemigrations 

बहुत महत्वपूर्ण बात, इस कदम पर आपको हर नए माइग्रेशन को संशोधित करना होगा और RenameModel Foo-> बार माइग्रेशन पर निर्भरता को जोड़ना होगा। तो अगर एक औरModel और YetAnotherModel दोनों myotherapp में हैं तो myotherapp में बनाया गया माइग्रेशन इस तरह दिखना चाहिए:

class Migration(migrations.Migration):

    dependencies = [
        ('myapp', '00XX_the_migration_of_myapp_with_renamemodel_foo_bar'),
        ('myotherapp', '00xx_the_migration_of_myotherapp_with_integerfield'),
    ]

    operations = [
        migrations.AlterField(
            model_name='anothermodel',
            name='foo',
            field=models.ForeignKey(to='myapp.Bar'),
        ),
        migrations.AlterField(
            model_name='yetanothermodel',
            name='foo',
            field=models.ForeignKey(to='myapp.Bar')
        ),
    ]

फिर

python manage.py migrate

चरण 4:

आखिरकार आप अपने खेतों का नाम बदल सकते हैं

class AnotherModel(models.Model):
    bar = models.ForeignKey(Bar) <------- Renamed fields
    is_awesome = models.BooleanField()


class YetAnotherModel(models.Model):
    bar = models.ForeignKey(Bar) <------- Renamed fields
    is_ridonkulous = models.BooleanField()

और फिर स्वत: नामकरण करें

python manage.py makemigrations

(django ने आपको पूछना चाहिए कि क्या आपने वास्तव में मॉडल का नाम बदला है, हां कहो)

python manage.py migrate

और बस!

यह Django1.8 पर काम करता है


3
धन्यवाद! यह बेहद मददगार था। लेकिन एक नोट - मुझे पोस्टग्रेएसक्यूएल फील्ड इंडेक्स को फिर से नाम देना और / या हटाना पड़ा क्योंकि फू को बार में नाम देने के बाद, मैंने बार नामक एक नया मॉडल बनाया।
अनातोली शेरेबाकोव

इसके लिए शुक्रिया! मुझे लगता है कि मुख्य भाग सभी विदेशी कुंजियों को परिवर्तित कर रहा है, या फिर मॉडल का नाम बदलकर इसमें किया जा सकता है IntegerField। यह मेरे लिए पूरी तरह से काम करता है, और इसका अतिरिक्त फायदा है कि वे सही नाम के साथ फिर से जुड़ जाते हैं। स्वाभाविक रूप से मैं वास्तव में उन्हें चलाने से पहले सभी पलायन की समीक्षा करने की सलाह दूंगा!
zelanix

धन्यवाद! मैंने एक मॉडल का नाम बदलने के लिए कई अलग-अलग रणनीतियों की कोशिश की, जिसमें अन्य मॉडलों में विदेशी कुंजी हैं (चरण 1-3), और यह एकमात्र ऐसा काम था।
MSH

फेरबदल ForeignKeyको रों IntegerFieldरों आज मेरा दिन बचाया!
Mehmet

8

मुझे वही काम करने और फॉलो करने की जरूरत थी। मैंने मॉडल को एक बार में ही बदल दिया (फ़िएवर के उत्तर से चरण 1 और 5 एक साथ)। फिर एक स्कीमा माइग्रेशन बनाया लेकिन इसे इस प्रकार संपादित किया:

class Migration(SchemaMigration):
    def forwards(self, orm):
        db.rename_table('Foo','Bar')

    def backwards(self, orm):
        db.rename_table('Bar','Foo')

यह पूरी तरह से काम किया। मेरे सभी मौजूदा डेटा ने दिखाया, अन्य सभी तालिकाओं ने बार फाइन को संदर्भित किया।

यहाँ से: https://hanmir.wordpress.com/2012/08/30/rename-model-django-south-migration/


महान, साझा करने के लिए धन्यवाद। अगर यह उत्तर मदद करता है तो +1 को सुनिश्चित करें।
Fiver

7

Django 1.10 के लिए, मैं केवल Makemigrations चलाकर दो मॉडल वर्ग के नाम (एक ForeignKey, और डेटा सहित) को बदलने में कामयाब रहा, और फिर ऐप के लिए माइग्रेट किया। मैकिमग्रेशन चरण के लिए, मुझे यह पुष्टि करनी थी कि मैं तालिका के नाम बदलना चाहता हूं। माइग्रेट ने बिना किसी समस्या के तालिकाओं के नाम बदल दिए।

फिर मैंने मैच करने के लिए फॉरेनके फील्ड का नाम बदल दिया, और फिर से मैक्मीग्रेशन से यह पुष्टि करने के लिए कहा गया कि मैं नाम बदलना चाहता हूं। परिवर्तन की तुलना में पलायन करें।

इसलिए मैंने इसे बिना किसी विशेष फ़ाइल संपादन के दो चरणों में लिया। मुझे पहली बार में त्रुटियां मिलीं, क्योंकि मैं @wasibigeek द्वारा बताए गए admin.py फ़ाइल को बदलना भूल गया।


आपका बहुत बहुत धन्यवाद! Django 1.11 के लिए भी सही
फ्रांसिस्को

5

मुझे इस समस्या का भी सामना करना पड़ा क्योंकि v.thorey ने वर्णन किया और पाया कि उसका दृष्टिकोण बहुत उपयोगी है लेकिन कम चरणों में संघनित किया जा सकता है जो वास्तव में चरण 5 से 8 है क्योंकि चरण 1 से 4 के बिना वर्णित फीवर को छोड़कर चरण 7 को बदलने की आवश्यकता है क्योंकि मेरी चरण 3 से नीचे। समग्र चरण निम्नानुसार हैं:

चरण 1: संबंधित क्षेत्र के नामों को मॉडल थिंकपैड में संपादित करें

class Bar(models.Model):
    name = models.CharField(unique=True, max_length=32)
    description = models.TextField(null=True, blank=True)


class AnotherModel(models.Model):
    bar = models.ForeignKey(Bar)  # <-- changed field name
    is_awesome = models.BooleanField()


class YetAnotherModel(models.Model):
    bar = models.ForeignKey(Bar)  # <-- changed field name
    is_ridonkulous = models.BooleanField()

चरण 2: एक खाली प्रवास बनाएँ

python manage.py makemigrations --empty myapp

चरण 3: चरण 2 में बनाई गई माइग्रेशन फ़ाइल में माइग्रेशन क्लास संपादित करें

class Migration(migrations.Migration):

dependencies = [
    ('myapp', '0001_initial'), 
]

operations = [
    migrations.AlterField(
        model_name='AnotherModel',
        name='foo',
        field=models.IntegerField(),
    ),
    migrations.AlterField(
        model_name='YetAnotherModel',
        name='foo',
        field=models.IntegerField(),
    ),
    migrations.RenameModel('Foo', 'Bar'),
    migrations.AlterField(
        model_name='AnotherModel',
        name='foo',
        field=models.ForeignKey(to='myapp.Bar'),
    ),
    migrations.AlterField(
        model_name='YetAnotherModel',
        name='foo',
        field=models.ForeignKey(to='myapp.Bar'),
    ),
    migrations.RenameField('AnotherModel', 'foo', 'bar'),
    migrations.RenameField('YetAnotherModel', 'foo', 'bar')
]

चरण 4: माइग्रेशन लागू करें

python manage.py migrate

किया हुआ

पी एस मैं Django 1.9 पर इस दृष्टिकोण की कोशिश की है


5

मैं Django संस्करण 1.9.4 का उपयोग कर रहा हूं

मुझे निम्नलिखित चरणों का पालन करना है: -

मेरे पास अभी पुराने मॉडल का नाम बदलकर न्यूनेम रन है python manage.py makemigrations। यह आप Did you rename the appname.oldName model to NewName? [y/N]सेलेक्ट Y के लिए पूछेगा

भागो python manage.py migrateऔर यह तुम्हारे लिए पूछेगा

निम्नलिखित सामग्री प्रकार बासी हैं और इन्हें हटाने की आवश्यकता है:

appname | oldName
appname | NewName

विदेशी कुंजी द्वारा इन सामग्री प्रकारों से संबंधित किसी भी ऑब्जेक्ट को भी हटा दिया जाएगा। क्या आप वाकई इन सामग्री प्रकारों को हटाना चाहते हैं? यदि आप अनिश्चित हैं, तो 'नहीं' का उत्तर दें।

Type 'yes' to continue, or 'no' to cancel: Select No

यह मेरे लिए सभी मौजूदा डेटा का नाम बदलकर नए नामित टेबल पर रख देता है।


धन्यवाद दोस्त, मैं उलझन में था क्योंकि कुछ भी नहीं हुआ जब "नहीं" मारने के बाद
farhawa

3

दुर्भाग्य से, मुझे समस्याएँ मिलीं (प्रत्येक django 1.x) नाम बदलने के साथ जो डेटाबेस में पुराने तालिका नाम छोड़ते हैं।

Django पुरानी मेज पर कुछ भी करने की कोशिश नहीं करता है, बस अपने खुद के मॉडल का नाम बदलें। विदेशी चाबियों के साथ एक ही समस्या है, और सामान्य रूप से सूचकांक - वहाँ परिवर्तन Django द्वारा ठीक से ट्रैक नहीं किया जाता है।

सबसे सरल उपाय (समाधान):

class Foo(models.Model):
     name = models.CharField(unique=True, max_length=32)
     ...
Bar = Foo  # and use Bar only

वास्तविक समाधान (2 सूचकांकों में सभी सूचकांकों, बाधाओं, ट्रिगर, नाम, आदि को स्विच करने का एक आसान तरीका है, लेकिन छोटे तालिकाओं के लिए):

प्रतिबद्ध ए:

  1. पुराने जैसा ही मॉडल बनाएं
# deprecated - TODO: TO BE REMOVED
class Foo(model.Model):
    ...

class Bar(model.Model):
    ...
  1. Barकेवल नए मॉडल के साथ काम करने के लिए स्विच कोड । (स्कीमा पर सभी संबंध शामिल हैं)

माइग्रेशन तैयारी में RunPython, जो फू से बार ( idफू सहित ) से डेटा कॉपी करते हैं

  1. वैकल्पिक अनुकूलन (यदि अधिक से अधिक तालिकाओं के लिए आवश्यक हो)

प्रतिबद्ध बी: (कोई जल्दी नहीं, ऐसा तब करें जब पूरी टीम पलायन कर जाए)

  1. पुराने मॉडल की सुरक्षित ड्रॉप Foo

आगे की सफाई:

  • पलायन पर स्क्वैश

Django में बग:


3

बस पुष्टि करना चाहते थे और केसरो टिप्पणी पर जोड़ना चाहते थे। Django 2.0 स्वचालित रूप से अब ऐसा करने लगता है।

मैं Django 2.2.1 पर हूं, मुझे केवल मॉडल का नाम बदलने और चलाने के लिए करना था makemigrations

यहाँ वह पूछता है कि मैं से विशिष्ट वर्ग का नाम बदला था Aकरने के लिए B, मैं हाँ और भाग विस्थापित चुना है और सब काम करने लगता है।

नोट: मैंने प्रोजेक्ट / माइग्रेशन फ़ोल्डर के अंदर किसी भी फाइल में पुराने मॉडल का नाम नहीं बदला है।


1

मुझे कुछ तालिकाओं का नाम बदलने की आवश्यकता थी। लेकिन केवल एक मॉडल का नाम Django द्वारा देखा गया था। ऐसा इसलिए हुआ क्योंकि Django जोड़ा गया है, फिर हटाए गए मॉडल। प्रत्येक जोड़ी के लिए यह जाँचता है कि क्या वे एक ही ऐप के हैं और समान क्षेत्र हैं । केवल एक तालिका में कोई विदेशी कुंजियाँ नहीं थीं जिनका नाम बदला जा सकता है (विदेशी कुंजी में मॉडल वर्ग का नाम होता है, जैसा कि आपको याद है)। दूसरे शब्दों में, केवल एक तालिका में कोई फ़ील्ड परिवर्तन नहीं था। इसलिए इस पर गौर किया गया।

तो, समाधान एक समय में एक तालिका का नाम बदलने का है models.py, संभवतः मॉडल मॉडल का नाम बदलना , संभवतः views.py, और माइग्रेशन बनाना। उसके बाद अन्य संदर्भ (मॉडल वर्ग के नाम, संबंधित (क्वेरी) नाम, चर नाम) के लिए अपने कोड का निरीक्षण करें। जरूरत पड़ने पर प्रवास करें। फिर, इन सभी माइग्रेशनों को वैकल्पिक रूप से एक में संयोजित करें (आयातों को कॉपी करना सुनिश्चित करें)।


1

मैं इस उत्तर पर उनकी टिप्पणी पर @ सीज़रो शब्द बनाऊंगा ।

Django के नए संस्करण परिवर्तनों का पता लगा सकते हैं और पूछ सकते हैं कि क्या किया गया था। मैं यह भी जोड़ूंगा कि Django कुछ माइग्रेशन कमांड के निष्पादन के आदेश को मिला सकता है।

यह बुद्धिमान हो छोटे परिवर्तन लागू करते हैं और चलाने के लिए होगा makemigrationsऔर migrateऔर त्रुटि तब होती है, तो माइग्रेशन फ़ाइल संपादित किया जा सकता।

कटाव से बचने के लिए निष्पादन की कुछ पंक्तियों को बदला जा सकता है।


ध्यान दें कि यह काम नहीं करता है यदि आप मॉडल के नाम बदलते हैं और विदेशी कुंजी परिभाषित हैं, आदि ...
डीन केटन

पिछली टिप्पणी पर विस्तार करते हुए: यदि मैं करता हूं तो सभी मॉडल के नाम बदल जाते हैं और मुझे मिलते हैं 'नामError: नाम' <oldmodel> 'को परिभाषित नहीं किया जाता है' विदेशियों, आदि में ... यदि मैं इसे बदल देता हूं और makigigrations चलाता हूं, तो मुझे आयात त्रुटियां मिलती हैं। in admin.py ... अगर मैं इसे ठीक करता हूं और दोबारा से चलाए जा रहा हूं, तो मुझे संकेत मिलते हैं 'क्या आपने <app.oldmodel> मॉडल को <newmodel>' नाम दिया है, लेकिन फिर माइग्रेशन लागू करने में, मुझे 'ValueRrror: फ़ील्ड <ऐप प्राप्त होता है .newmodel.field1> को '<app.oldmodel>' के लिए एक आलसी संदर्भ के साथ घोषित किया गया था, लेकिन ऐप '<app>' मॉडल '<oldmodel>' आदि प्रदान नहीं करता है ... '
डीन केटन

यह त्रुटि ऐसी लगती है जैसे आपको अपने ऐतिहासिक पलायन में संदर्भों का नाम बदलने की आवश्यकता है।
शाम

@DeanKayton कहेगा कि migrations.SeparateDatabaseAndStateमदद कर सकता है?
डायोगोसिमो

1

यदि आप PyCharm की तरह एक अच्छे IDE का उपयोग कर रहे हैं, तो आप मॉडल के नाम पर राइट क्लिक कर सकते हैं और रिफ्लेक्टर -> नाम बदल सकते हैं। यह आपको मॉडल को संदर्भित करने वाले आपके सभी कोड से गुजरने की परेशानी से बचाता है। फिर makemigrations चलाएं और माइग्रेट करें। Django 2+ केवल नाम परिवर्तन की पुष्टि करेगा।


-10

मैंने Django को संस्करण 10 से संस्करण 11 में उन्नत किया:

sudo pip install -U Django

( -U"अपग्रेड" के लिए) और इसने समस्या को हल कर दिया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.