মডেল এবং সম্পর্কের ক্ষেত্রগুলির নাম পরিবর্তন করার জন্য জাজানো মাইগ্রেশন কৌশল


152

আমি বিদ্যমান জ্যাঙ্গো প্রকল্পে বেশ কয়েকটি মডেলের নাম পরিবর্তন করার পরিকল্পনা করছি যেখানে এমন আরও অনেক মডেল রয়েছে যেখানে আমি নাম পরিবর্তন করতে চাই এমন মডেলগুলির সাথে বিদেশী কী সম্পর্ক রয়েছে। আমি মোটামুটি নিশ্চিত যে এর জন্য একাধিক স্থানান্তর প্রয়োজন হবে, তবে আমি সঠিক পদ্ধতি সম্পর্কে নিশ্চিত নই।

ধরা যাক আমি জ্যাঙ্গো অ্যাপ নামে পরিচিত একটি মডেলের সাথে নিম্নলিখিত মডেলগুলি দিয়ে শুরু করি 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আরও পরিষ্কার নাম তৈরি করবে।

জাজানো বিকাশের নথিতে আমি যা পড়েছি তা থেকে, আমি নিম্নলিখিত স্থানান্তর কৌশলটি ধরে নিচ্ছি:

ধাপ 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মডেলটিতে আপডেট করা হয়েছে । আমার যুক্তি হ'ল আমার একবারে খুব বেশি পরিবর্তন করা উচিত নয় এবং আমি যদি এই ফিল্ডের নামটি পরিবর্তন করি তবে আমি barcolumn কলামের ডেটা হারাতে পারি risk

ধাপ ২

একটি খালি স্থানান্তর তৈরি করুন:

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যুক্ত করতে step ধাপে তৈরি মাইগ্রেশন ফাইলটিতে শ্রেণি সম্পাদনা করুন 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')
    ]

আপনি আমদানি করা নামগুলি যেমন অ্যাডমিন.পি এবং এমনকি পুরানো মাইগ্রেশন ফাইলগুলি (!) আপডেট না করে আপনি কিছু ত্রুটি পেতে পারেন।

আপডেট : সিসারো হিসাবে উল্লেখ করা হয়েছে, জ্যাঙ্গোর নতুন সংস্করণগুলি সাধারণত কোনও মডেলের নামকরণ হয়েছে কিনা তা সনাক্ত করতে এবং জানতে সক্ষম হয়। সুতরাং manage.py makemigrationsপ্রথমে চেষ্টা করুন এবং তারপরে মাইগ্রেশন ফাইলটি পরীক্ষা করুন।


উত্তর করার জন্য ধন্যবাদ. আমি তখন থেকে আমার যে ধাপগুলি বর্ণিত হয়েছিল সেগুলি ব্যবহার করে হিজরত করেছি, তবে আপনি যদি আগ্রহী বিদ্যমান ডেটা দিয়ে বা কেবল একটি খালি ডাটাবেস দিয়ে চেষ্টা করে থাকেন তবে আমি আগ্রহী?
Fiver

2
আমার স্থানীয় এনভির স্ক্য্লাইটে কয়েকটি সারি সত্ত্বেও বিদ্যমান তথ্য দিয়ে এটি ব্যবহার করে দেখেছি (আমি যখন প্রোডাকশনে চলে আসি তখন আমি মাইগ্রেশন ফাইলগুলি সমস্ত কিছু মুছতে
চাইব

4
আপনি যদি মাইগ্রেশন ফাইলগুলিতে মডেল নাম ব্যবহার apps.get_modelকরেন তবে সেগুলি ব্যবহার করতে হবে না। এটি বের করার জন্য আমাকে অনেক সময় নিয়েছে।
আহমদ

9
জাঙ্গো ২.০-তে আপনি যদি নিজের মডেলের নাম পরিবর্তন করেন তবে ./manage.py makemigrations myappকমান্ডটি আপনাকে জিজ্ঞাসা করবে যে আপনি নিজের মডেলটির নাম পরিবর্তন করেছেন কিনা। উদাহরণস্বরূপ: আপনি কি বারে মাইএপ.ফু মডেলটির নামকরণ করেছেন? [y / N] আপনি যদি 'y' এর উত্তর দেন তবে আপনার স্থানান্তরতে migration.RenameModel('Foo', 'Bar')নাম পরিবর্তন করা ক্ষেত্রগুলির জন্য একই গণনা থাকবে :-)
সিআসরো

1
manage.py makemigrations myappতবুও ব্যর্থ হতে পারে: "আপনি যদি মডেলটির নাম এবং এর বেশ কয়েকটি ক্ষেত্র একবারে একবারে পরিবর্তন করতে পারেন তবে আপনাকে নিজে নিজে এটি যুক্ত করতে হবে; অটোডেক্টরটিতে, এটি দেখতে আপনাকে পুরানো নাম সহ একটি মডেল মুছে ফেলা হয়েছে এবং এর সাথে একটি নতুন যুক্ত করেছে একটি আলাদা নাম এবং এটি তৈরি করা স্থানান্তর পুরানো সারণীতে থাকা কোনও ডেটা হারাবে। জ্যাঙ্গো ২.১ ডক্স আমার জন্য, এটি খালি মাইগ্রেশন তৈরি করা যথেষ্ট ছিল, এতে মডেলটির নাম যুক্ত করুন, তারপরে makemigrationsযথারীতি চালান ।
hlongmore

36

প্রথমে, আমি ভেবেছিলাম যে ফাইভারের পদ্ধতিটি আমার পক্ষে কাজ করেছে কারণ মাইগ্রেশনটি ৪ ম পদক্ষেপ পর্যন্ত ভালভাবে কাজ করেছে তবে যাইহোক, 'বিদেশিকিফিল্ড' (বার) 'তে অন্তর্নিহিত পরিবর্তনগুলি কোনও স্থানান্তরের সাথে সম্পর্কিত ছিল না। আমি সম্পর্কের ক্ষেত্রগুলির নাম পরিবর্তন করতে চাইলে মাইগ্রেশন ব্যর্থ হয়েছিল (পদক্ষেপ 5-8)। এটি আমার ক্ষেত্রে 'আমার আরেকটি মডেল' এবং 'তবুও আনথারমোডেল' অন্যান্য অ্যাপ্লিকেশনে প্রেরণ করা হয়েছে এর কারণ হতে পারে।

সুতরাং আমি নীচের পদক্ষেপগুলি অনুসরণ করে আমার মডেলগুলি এবং সম্পর্কের ক্ষেত্রগুলির নাম পরিবর্তন করতে পেরেছি:

আমি এটিকে এবং বিশেষত ওট্রঞ্জার এর কৌশলটি অভিযোজিত করেছি।

সুতরাং ফাইভারের মতো বলা যাক আমাদের মাই্যাপে রয়েছে :

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:

প্রতিটি ওয়ানটোঅনফিল্ড (ফু) বা ফরেনকেএফিল্ড (ফু) ইন্টিজারফিল্ডে রূপান্তর করুন ()। (এটি সম্পর্কিত ফু অবজেক্টের আইডি পূর্ণসংখ্যার ক্ষেত্রের মান হিসাবে রাখবে)।

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: (ফাইভার থেকে 2-2 ধাপের মতো)

মডেলের নাম পরিবর্তন করুন

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:

আপনার ইন্টিজারফিল্ড ()টিকে তাদের আগের বিদেশীকিফিল্ড বা ওয়ানটোওনফিল্ডে রূপান্তর করুন তবে নতুন বার মডেল দিয়ে। (পূর্ববর্তী ইন্টিজারফিল্ডটি আইডিটি সংরক্ষণ করছিল, তাই জাঙ্গো এটি বুঝতে পারে এবং সংযোগটি পুনরায় স্থাপন করতে পারে যা দুর্দান্ত।)

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 

খুব গুরুত্বপূর্ণ, এই পদক্ষেপে আপনাকে প্রতিটি নতুন স্থানান্তর পরিবর্তন করতে হবে এবং রেনামমোডেল ফু-> বার স্থানান্তরগুলির উপর নির্ভরতা যুক্ত করতে হবে। সুতরাং যদি আরেকটি মডেল এবং তবুও আনথোমোডেল উভয়ই মায়োথেরাপে থাকে তবে মায়োথেরাপে তৈরি মাইগ্রেশনটি অবশ্যই দেখতে হবে:

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

(জ্যাঙ্গো আপনাকে জিজ্ঞাসা করা উচিত যদি আপনি প্রকৃতরূপে নামটির নামকরণ করেন, তবে হ্যাঁ বলুন)

python manage.py migrate

এবং এটাই!

এটি জ্যাঙ্গো 1.8 এ কাজ করে


3
ধন্যবাদ! এটি অত্যন্ত সহায়ক ছিল। তবে একটি নোট - আমাকে পোস্টগ্র্রেএসকিউএল ফিল্ড সূচকগুলি নিজের হাতে নামকরণ এবং / বা অপসারণ করতে হয়েছিল কারণ, ফু-কে বার নামকরণের পরে, আমি বার নামে একটি নতুন মডেল তৈরি করেছি।
আনাতোলি শেহেরবাভভ

এই জন্য আপনাকে ধন্যবাদ! আমি মনে করি যে মূল অংশ পুনরায় নাম দেওয়ার মডেল সব বিদেশী কী রূপান্তর করা হয়, বা আউট, এর IntegerField। এটি আমার পক্ষে নিখুঁতভাবে কাজ করেছে এবং এগুলির আরও যুক্ত সুবিধা রয়েছে যে তারা সঠিক নাম দিয়ে পুনরায় তৈরি করে। স্বাভাবিকভাবেই আমি সমস্ত অভিবাসনগুলি চালানোর আগে তাদের পর্যালোচনা করার পরামর্শ দেব!
জেলানিক্স

ধন্যবাদ! আমি এমন একটি মডেলটির নতুন নামকরণের জন্য অনেকগুলি কৌশল চেষ্টা করেছি যাতে অন্যান্য মডেলগুলির বিদেশী চাবি রয়েছে (পদক্ষেপ 1-3) এবং এটি কেবলমাত্র কাজ করেছিল।
এমএসএইচ

পরিবর্তনকারী ForeignKeyথেকে গুলি IntegerFieldগুলি আজ আমার দিন সংরক্ষিত!
মেহমেট

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 করতে ভুলবেন না।
ফাইভার

7

জাজানো ১.১০-এর জন্য, আমি কেবল মেকমিগ্রেশন পরিচালনা করে এবং তারপরে অ্যাপ্লিকেশানের জন্য মাইগ্রেট করে দুটি মডেল শ্রেণির নাম (একটি ফরেনকি সহ এবং ডেটা সহ) পরিবর্তন করতে পেরেছি। Makemigration পদক্ষেপের জন্য, আমাকে নিশ্চিত করতে হয়েছিল যে আমি টেবিলের নামগুলি পরিবর্তন করতে চাই। মাইগ্রেট কোনও সমস্যা ছাড়াই সারণির নাম পরিবর্তন করেছে।

তারপরে আমি ম্যাচে ফরেনকি মাঠের নামটি পরিবর্তন করে দিয়েছিলাম এবং আবার মেকমিগ্রেশনস আমাকে জিজ্ঞাসা করেছিল যে আমি নামটি পরিবর্তন করতে চাই। পরিবর্তন করার চেয়ে মাইগ্রেট করুন।

সুতরাং আমি কোনও বিশেষ ফাইল সম্পাদনা ছাড়াই এটি দুটি পদক্ষেপে নিয়েছি। আমি প্রথমে ত্রুটিগুলি পেয়েছি কারণ @wasibigeek দ্বারা উল্লিখিত হিসাবে আমি অ্যাডমিন.পি ফাইলটি পরিবর্তন করতে ভুলে গেছি।


অনেক ধন্যবাদ! জ্যাঙ্গো 1.11 এর জন্যও পারফেক্ট
ফ্রান্সিসকো

5

V.thorey বর্ণনা করার সাথে সাথে আমিও এই সমস্যার মুখোমুখি হয়েছি এবং দেখতে পেয়েছি যে তার পদ্ধতিটি খুব দরকারী তবে এটি কয়েকটি পদক্ষেপে ঘনীভূত হতে পারে যা আসলে 5 থেকে 8 ধাপে ফাইভার হিসাবে 1 থেকে 4 ধাপ ব্যতীত বর্ণিত ছিল step ধাপটি আমার হিসাবে পরিবর্তন করা দরকার পদক্ষেপের নীচে ৩. সামগ্রিক পদক্ষেপগুলি নিম্নরূপ:

পদক্ষেপ 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: দ্বিতীয় ধাপে তৈরি মাইগ্রেশন ফাইলটিতে মাইগ্রেশন ক্লাস সম্পাদনা করুন

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')
]

চতুর্থ ধাপ: মাইগ্রেশন প্রয়োগ করুন

python manage.py migrate

সম্পন্ন

PS আমি জ্যাঙ্গো ১.৯ এ এই পদ্ধতির চেষ্টা করেছি


5

আমি জ্যাঙ্গো সংস্করণটি 1.9.4 ব্যবহার করছি

আমি নিম্নলিখিত পদক্ষেপগুলি অনুসরণ করেছি: -

আমি সবেমাত্র পুরানো নামটির নতুন নামটি নতুন নামকরণ করে নামকরণ করেছি python manage.py makemigrations। এটি আপনাকে Did you rename the appname.oldName model to NewName? [y/N]নির্বাচনী ওয়াইয়ের জন্য জিজ্ঞাসা করবে

চালান python manage.py migrateএবং এটি আপনাকে জিজ্ঞাসা করবে

নিম্নলিখিত সামগ্রীর প্রকারগুলি বাসি এবং মুছে ফেলা দরকার:

appname | oldName
appname | NewName

কোনও বিদেশী কী দ্বারা এই বিষয়বস্তুর প্রকারের সাথে সম্পর্কিত যে কোনও অবজেক্টও মুছে যাবে। আপনি কি নিশ্চিত যে আপনি এই সামগ্রীর ধরণগুলি মুছতে চান? আপনি যদি অনিশ্চিত হন তবে উত্তর 'না' দিয়ে দিন।

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

এটি আমার জন্য বিদ্যমান সমস্ত ডেটা নতুন নামযুক্ত টেবিলের নাম পরিবর্তন করে স্থানান্তর করে।



3

দুর্ভাগ্যক্রমে, আমি নতুন নামান্তর স্থানান্তর করতে সমস্যাগুলি (প্রতিটি জ্যাঙ্গো 1.x) পেয়েছি যা ডাটাবেসে পুরানো টেবিলের নাম রাখে।

জ্যাঙ্গো এমনকি পুরানো টেবিলটিতে কিছু চেষ্টা করে না, কেবল নিজের মডেলের নাম পরিবর্তন করে। বিদেশী কীগুলি এবং সাধারণ সূচকগুলির ক্ষেত্রে একই সমস্যা - পরিবর্তনগুলি জ্যাঙ্গো দ্বারা সঠিকভাবে ট্র্যাক করা যায় না।

সবচেয়ে সহজ সমাধান (কার্যতঃ):

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. alচ্ছিক অপ্টিমাইজেশন (বৃহত্তর টেবিলগুলির জন্য প্রয়োজন হলে)

কমিট বি: (কোনও তাড়াহুড়া করবেন না, পুরো দলটি স্থানান্তরিত হয়ে গেলে এটি করুন)

  1. পুরানো মডেল নিরাপদ ড্রপ Foo

আরও পরিষ্কার:

  • মাইগ্রেশন উপর স্কোয়াশ

জ্যাঙ্গোতে বাগ:


3

সিসারো মন্তব্যটি কেবল নিশ্চিত করতে এবং যুক্ত করতে চেয়েছিলেন। জ্যাঙ্গো ২.০ এখন স্বয়ংক্রিয়ভাবে এটি করবে বলে মনে হচ্ছে।

আমি জ্যাঙ্গো ২.২.১ এ আছি, মডেলটির নাম পরিবর্তন করে চালানোর জন্য আমাকে যা করতে হয়েছিল তা সবই makemigrations

এখানে এটা জিজ্ঞেস করে আমি থেকে নির্দিষ্ট বর্গ নতুন নামকরণ করেছিলেন Aকরতে B, আমি হ্যাঁ এবং দৌড়ে স্থানান্তরণের বেছে নেওয়া হয়েছে এবং সমস্ত কাজ মনে হয়।

দ্রষ্টব্য আমি প্রকল্প / মাইগ্রেশন ফোল্ডারের অভ্যন্তরের কোনও ফাইলে পুরানো মডেলের নামটির নামকরণ করি নি।


1

আমার কয়েকটি টেবিলের নতুন নামকরণ করা দরকার। তবে কেবলমাত্র একটি মডেলের নামই জ্যাঙ্গো লক্ষ্য করেছিলেন। এটি ঘটল কারণ জ্যাঙ্গো পুনরায় পুনরুক্তি যোগ করেছে, তারপরে মডেলগুলি সরানো হয়েছে। প্রতিটি জোড়ের জন্য এটি পরীক্ষা করে যে তারা একই অ্যাপ্লিকেশন এবং অভিন্ন ক্ষেত্র রয়েছে কিনা । নামকরণের জন্য কেবলমাত্র একটি টেবিলের কাছে কোনও বিদেশী কী নেই (বিদেশী কীগুলিতে মডেল শ্রেণীর নাম রয়েছে, যেমনটি আপনার মনে আছে)। অন্য কথায়, কেবল একটি টেবিলে কোনও ক্ষেত্র পরিবর্তন হয়নি changes সে কারণেই এটি নজরে পড়েছিল।

সুতরাং, সমাধানটি হ'ল একবারে একটি টেবিলের নাম পরিবর্তন করে models.py, সম্ভবত মডেল শ্রেণীর নাম পরিবর্তন করা views.pyএবং মাইগ্রেশন করা। এর পরে অন্যান্য রেফারেন্সের জন্য আপনার কোডটি পরীক্ষা করুন (মডেল শ্রেণীর নাম, সম্পর্কিত (ক্যোয়ারী) নাম, পরিবর্তনশীল নাম)। প্রয়োজনে স্থানান্তর করুন। তারপরে, allচ্ছিকভাবে এই সমস্ত স্থানান্তরকে এক সাথে সংযুক্ত করুন (আমদানির অনুলিপিটিও নিশ্চিত করে নিন)।


1

আমি @ সিসরো শব্দগুলি তৈরি করব, এই উত্তর সম্পর্কে তার মন্তব্যে আমার ।

জ্যাঙ্গোর নতুন সংস্করণগুলি পরিবর্তনগুলি সনাক্ত করতে পারে এবং কী হয়েছিল তা জানতে পারে। আমি আরও যোগ করব যে জ্যাঙ্গো কিছু স্থানান্তর কমান্ড কার্যকর করার ক্রমের সাথে মিশতে পারে।

এটা তোলে জ্ঞানী হও ছোট পরিবর্তনগুলি প্রয়োগ এবং চালানোর জন্য হবে makemigrationsএবং migrateএবং ত্রুটি দেখা দেয় যদি মাইগ্রেশন ফাইল সম্পাদনা করা যাবে।

এররগুলি এড়ানোর জন্য কয়েকটি লাইনের আদেশ কার্যকর করা যেতে পারে।


দয়া করে মনে রাখবেন এই কাজ যদি আপনি মডেল নাম পরিবর্তন এবং সেখানে বিদেশী কী সংজ্ঞায়িত হয়, ইত্যাদি ... না রাখা ভাল
ডিন Kayton

পূর্ববর্তী মন্তব্যে সম্প্রসারণ: আমি যা করি তা হ'ল মডেলের নাম পরিবর্তন করা এবং মেকিগ্রেশনগুলি চালানো হলে আমি 'নেম এরির: বিদেশী খেলোয়াড় ইত্যাদিতে নাম' <oldmodel> 'সংজ্ঞায়িত নয়' ইত্যাদি ... আমি যদি এটি পরিবর্তন করি এবং মেকিমিগ্রেশন চালনা করি, আমি আমদানি ত্রুটি পেয়েছি অ্যাডমিন.পি ... ... আমি যদি এটি ঠিক করে নিয়ে আবার মেকমিগ্রেশন পরিচালনা করি তবে আমি প্রম্পটগুলি পাই 'আপনি কি <app.oldmodel> মডেলটির নাম << নিউ মডেল>' রেখেছিলেন তবে মাইগ্রেশন প্রয়োগের সময় আমি 'ভ্যালুয়েরর: ফিল্ড <অ্যাপ্লিকেশন পেয়েছি .newmodel.field1> '<app.oldmodel>' এর অলস রেফারেন্স সহ ঘোষিত হয়েছিল, তবে অ্যাপ্লিকেশন <<app> 'মডেল' <oldmodel> 'ইত্যাদি সরবরাহ করে না ...'
ডিন কেটন

এই ত্রুটিটি দেখে মনে হচ্ছে আপনার historicalতিহাসিক স্থানান্তরগুলিতে আপনার রেফারেন্সটির নাম পরিবর্তন করতে হবে।
mhatch

@ ডিয়ান কেটন কি বলবে যে migrations.SeparateDatabaseAndStateএটি সাহায্য করতে পারে?
ডায়োগোসিমও

1

আপনি যদি পাইচার্মের মতো কোনও ভাল আইডিই ব্যবহার করে থাকেন তবে আপনি মডেলের নামটিতে ডান ক্লিক করতে পারেন এবং একটি রিফ্যাক্টর -> নাম পরিবর্তন করতে পারেন। এটি আপনাকে মডেলটির উল্লেখ করে আপনার সমস্ত কোডের মধ্য দিয়ে যাওয়ার ঝামেলা বাঁচায়। তারপরে মেকিমিগ্রেশনগুলি চালান এবং মাইগ্রেট করুন। জ্যাঙ্গো 2+ কেবল নাম পরিবর্তনের বিষয়টি নিশ্চিত করবে।


-10

আমি জ্যাঙ্গোকে সংস্করণ 10 থেকে সংস্করণ 11 এ আপগ্রেড করেছি:

sudo pip install -U Django

( -U"আপগ্রেড" এর জন্য) এবং এটি সমস্যার সমাধান করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.