জ্যাঙ্গো / দক্ষিণ ব্যবহার করে কোনও মডেলটির নামকরণের সবচেয়ে সহজ উপায়?


141

আমি দক্ষিণের সাইট, গুগল এবং এসওতে এর উত্তরের খোঁজ করছি, তবে এটি করার সহজ কোনও উপায় খুঁজে পাইনি।

আমি দক্ষিণ ব্যবহার করে একটি জ্যাঙ্গো মডেলের নাম পরিবর্তন করতে চাই। বলুন আপনার নিম্নলিখিত রয়েছে:

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, কিন্তু উপেক্ষা করা fooমধ্যে সদস্য FooTwoএখন জন্য।

দক্ষিণ ব্যবহার করে এটি করার সহজতম উপায় কী?

  1. আমি সম্ভবত একটি ডেটা মাইগ্রেশন করতে পারি, তবে এটি বেশ জড়িত বলে মনে হচ্ছে।
  2. একটি কাস্টম স্থানান্তর লিখুন, উদাহরণস্বরূপ db.rename_table('city_citystate', 'geo_citystate'), তবে এই ক্ষেত্রে কীভাবে বিদেশী কী ঠিক করা যায় তা আমি নিশ্চিত নই।
  3. একটি সহজ উপায় যে আপনি জানেন?

5
আরও দেখুন stackoverflow.com/questions/3235995/... একটি পুনঃনামকরনের জন্য মডেল ক্ষেত্র একটি বদলে মডেল
যান্ত্রিক শামুক

জ্যাঙ্গোর জন্য অনুকূল সমাধান> = 1.8 স্ট্যাকওভারফ্লো.com
রাসায়নিক প্রোগ্রামার

উত্তর:


130

আপনার প্রথম প্রশ্নের উত্তর দিতে, সাধারণ মডেল / টেবিলের নামটি বেশ সোজা। কমান্ডটি চালান:

./manage.py schemamigration yourapp rename_foo_to_bar --empty

(আপডেট 2: নীচের সতর্কতা এড়াতে --autoপরিবর্তে চেষ্টা করুন --empty। টিপটির জন্য @ কেএফবিকে ধন্যবাদ)

আপনি যদি দক্ষিণের কোনও পুরানো সংস্করণ startmigrationব্যবহার করেন তবে এর পরিবর্তে আপনার প্রয়োজন হবে schemamigration

তারপরে মাইগ্রেশন ফাইলটিকে ম্যানুয়ালি সম্পাদনা করুন এর মতো দেখতে:

class Migration(SchemaMigration):

    def forwards(self, orm):
        db.rename_table('yourapp_foo', 'yourapp_bar')


    def backwards(self, orm):
        db.rename_table('yourapp_bar','yourapp_foo')   

আপনি db_tableআপনার মডেল শ্রেণিতে মেটা বিকল্পটি ব্যবহার করে আরও সহজে এটি সম্পাদন করতে পারেন । তবে যতবার আপনি এটি করেন, আপনি আপনার কোডবেসের উত্তরাধিকারের ওজন বাড়িয়ে দেন - শ্রেণীর নাম টেবিলের নাম থেকে আলাদা হয় আপনার কোড বুঝতে এবং বজায় রাখা আরও শক্ত করে তোলে। স্পষ্টতার স্বার্থে আমি এর মতো সরল রিফ্যাক্টরিংগুলি সম্পূর্ণ সমর্থন করি।

(আপডেট) আমি প্রযোজনায় এটি চেষ্টা করেছি এবং মাইগ্রেশন প্রয়োগ করতে গিয়ে এক আজব সতর্কতা পেয়েছি। এটি বলেছিল:

The following content types are stale and need to be deleted:

    yourapp | foo

Any objects related to these content types by a foreign key will also
be deleted. Are you sure you want to delete these content types?
If you're unsure, answer 'no'.

আমি "না" জবাব দিয়েছি এবং সবকিছু ঠিক আছে বলে মনে হচ্ছে।


3
আমি ত্রুটি বার্তাটি এড়াতে সক্ষম হয়েছি যে --empty পরিবর্তে --auto ব্যবহার করে স্কিমা মাইগ্রেশন তৈরি করে লিওপ্ড। আমি তখন মাইগ্রেশন ফাইল সম্পাদনা করেছি, টেবিলগুলির মোছা / সারণিটিকে একটি db.rename_table () কল হিসাবে পরিবর্তন করেছি। এটি খুব ভাল কাজ করেছে বলে মনে হয়।
কেএফবি

4
আমি কোনও ত্রুটি না পেয়ে 9/2/2011 এ এই কৌশলটি ব্যবহার করেছি। দক্ষিণের একটি নতুন সংস্করণ ত্রুটিগুলি দিয়ে সমস্যার সমাধান করেছে।
চিপ টোল

1
এটি আপডেট করার জন্য ধন্যবাদ! নীচে জিয়ানের উত্তর বলেছে "সেন্ড_ক্রিয়েট_সিগন্যাল" কলগুলি রাখা গুরুত্বপূর্ণ, আপনি কি সে সম্পর্কে কোনও জ্ঞান রাখেন? আপনি যদি সম্মত হন তবে আপনার উদাহরণ মাইগ্রেশন আপডেট করা দুর্দান্ত be
মুরুনি

5
সাবধান হন যে এটি সেই টেবিলের সূচিগুলির নাম পরিবর্তন করবে না। যদি আপনি ভবিষ্যতে পুরানো টেবিলের একই নামটি দিয়ে একটি নতুন টেবিল তৈরি করেন তবে আপনি সূচকের নামগুলির সংঘর্ষে ত্রুটি পেতে পারেন। আমরা এই কৌশলটি ব্যবহার করছিলাম তবে এখন থেকে আমরা স্পষ্টভাবে নতুন টেবিল তৈরি করতে যাচ্ছি, ডেটা স্থানান্তর করতে, এবং তারপরে পুরানো টেবিলটি মুছতে চাই।
জেরেমি ব্যাংক

3
মূল মডেলে এম 2 এম টেবিলের মতো স্বয়ংক্রিয়ভাবে উত্পন্ন টেবিলগুলিতে কলামের নামগুলিও এই পদ্ধতিতে স্থানান্তরিত হয় না।
spookylukey

66

পরিবর্তন করুন 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নতুন মডেলের নামের সাথে একটি নতুন তৈরি করবে । কিন্তু এটা শুধু ভালো যদি আপনি ইতিমধ্যেই আছে ক্ষেত্রে সেখানে (ক মাধ্যমে, যেমন ডাটাবেসের এটি এর প্রতি নির্দেশ বস্তু )।updateContentTypeGenericForeignKey

এছাড়াও, আপনি যদি কিছু কলামের নাম বদলে দিয়েছেন যা নাম পরিবর্তন করা মডেলটির বিদেশী কী,

db.rename_column(myapp_model, foo_id, bar_id)

2
আমি ত্রুটি পেয়েছি, কীআরার: "অ্যাপ্লিকেশনটির 'কনটেন্ট টাইপস' মডেল 'কনটেন্ট টাইপ' এই মাইগ্রেশনে উপলভ্য নয়" " এছাড়াও, আমার কাছে একটি জ্যাঙ্গো_ কনটেন্ট_প্রকারের টেবিল রয়েছে তবে একটি সামগ্রী ধরণের টেবিল নয়। (জাজানো 1.6)
শেঠ

2
@Seth আমি আলাদাভাবে ডেটা মাইগ্রেশনে কনটেন্ট টাইপ মডেলগুলি আপডেট contenttypes.ContentTypeকরে এবং --frozenপতাকাটি ব্যবহার করে হিমায়িত মডেলগুলিতে মডেল যুক্ত করে এর আশেপাশে কাজ করেছি ./manage.py datamigration। উদাহরণস্বরূপ: ./manage.py datamigration --frozen contenttypes myapp update_contenttypes। তারপরে উপরে উল্লিখিত হিসাবে কন্টেন্ট টাইপ আপডেটিং কোড সহ myapp_migration / NNNN_update_contenttyype.py সম্পাদনা করুন।
জেফ্রি হিং

@ জিওফ্রেহিং আমি মনে করি প্যারামিটারটি হিমশীতল নয়। সাউথ.রেডহেডসস.আইও.এন / স্লেট / হরফ ফ্রিজিং এইচটিটিএমএল তবে আপনার সহায়তার জন্য আপনাকে অনেক ধন্যবাদ, এটি সত্যই সহায়ক ছিল।
সিসাকাকুয়েব

5

দক্ষিণ এটি নিজেই করতে পারে না - এটি কীভাবে জানতে পারে যে এটি Barপূর্বেকার বিষয়গুলির প্রতিনিধিত্ব Fooকরে? এটি আমি সাজানোর জন্য কাস্টম মাইগ্রেশন লিখি। আপনি নিজের ForeignKeyকোডটি উপরের মতো করে পরিবর্তন করতে পারবেন এবং তারপরে এটি উপযুক্ত ক্ষেত্র এবং সারণীগুলির নামকরণের একটি ঘটনা, যা আপনি যে কোনও উপায়ে চান তা করতে পারেন।

অবশেষে, আপনার কি সত্যিই এটি করা দরকার? আমার এখনও মডেলগুলির নাম পরিবর্তন করতে হবে - মডেলের নামগুলি কেবল একটি বাস্তবায়নের বিশদ - বিশেষত verbose_nameমেটা বিকল্পের উপলব্ধতার কারণে ।


7
বিকল্পভাবে, কোডটিতে মডেলটির নাম পরিবর্তন করুন db_tableতবে ডাটাবেস সারণির নাম একই রাখার জন্য মেটা বিকল্পটি ব্যবহার করুন ।
ড্যানিয়েল রোজম্যান 19'10

@ ড্যানিয়েল - আপনি কি জানেন db_tableবিদেশী কী নামগুলি ব্যবহার করতে ব্যবহৃত হয়?
ডমিনিক রজার

আমি বিশ্বাস করি। আপনি যদি মডেলের নাম পরিবর্তন করেন এবং db_table সেট করেন তবে এখনও প্রত্যাশা অনুযায়ী কাজ করা উচিত।
লুভিক

1
@ ড্যানিয়েলরোজম্যান এটি পুরো থ্রেডের সেরা সমাধান!
joerick

-1

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

ঠিক বুঝতে পেরেছি, কেউ প্রথমে মডেলের নাম পরিবর্তন করে শুরু করতে পারে, তারপরে মাইগ্রেশন ফাইল প্রয়োগ করার আগে তাদের সম্পাদনা করতে পারে। অনেক ক্লিনার

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