জাঙ্গো - দক্ষিণ ব্যবহার করে কোনও মডেল ক্ষেত্রের নাম কীভাবে রাখবেন?


209

আমি একটি মডেলের নির্দিষ্ট ক্ষেত্রের নাম পরিবর্তন করতে চাই:

class Foo(models.Model):
    name = models.CharField()
    rel  = models.ForeignKey(Bar)

এতে পরিবর্তন করা উচিত:

class Foo(models.Model):
    full_name     = models.CharField()
    odd_relation  = models.ForeignKey(Bar)

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


7
মডেল ক্ষেত্রের পরিবর্তে কোনও মডেলটির নামকরণের জন্য স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / ২66২ 79 79 /… দেখুন ।
যান্ত্রিক শামুক

উত্তর:


230

আপনি db.rename_columnফাংশন ব্যবহার করতে পারেন ।

class Migration:

    def forwards(self, orm):
        # Rename 'name' field to 'full_name'
        db.rename_column('app_foo', 'name', 'full_name')




    def backwards(self, orm):
        # Rename 'full_name' field to 'name'
        db.rename_column('app_foo', 'full_name', 'name')

এর প্রথম যুক্তিটি db.rename_columnহ'ল টেবিলের নাম, সুতরাং জ্যাঙ্গো কীভাবে সারণির নাম তৈরি করে তা মনে রাখা গুরুত্বপূর্ণ :

জ্যাঙ্গো আপনার মডেল শ্রেণীর নাম এবং এতে থাকা অ্যাপ্লিকেশনটির থেকে স্বয়ংক্রিয়ভাবে ডাটাবেস টেবিলের নাম। কোনও মডেলের ডাটাবেস টেবিলের নামটি মডেলটির "অ্যাপ লেবেল" - আপনি যে নামটি ম্যানেজ.পি স্টার্টআপে ব্যবহার করেছেন - মডেলটির শ্রেণীর নামের সাথে জুড়ে দিয়ে তৈরি করা হয়, যার মধ্যে একটি আন্ডারস্কোর থাকে।

কেস যেমন ProjectItem যেমন যেখানে আপনি একটি বহু-ভাষায়, উটের-cased মডেলের নাম আছে, ইন, টেবিল নাম হবে app_projectitem(অর্থাত, একটি আন্ডারস্কোর মধ্যে সন্নিবেশিত করা হবে না projectএবং itemযদিও তারা উট-cased হয়)।


2
এটি পুরোপুরি নামের উপর কাজ করবে, তবে সম্পর্কের ক্ষেত্রে নয়, তাই না?
জোনাথন

23
গুরুত্বপূর্ণ দ্রষ্টব্য: আপনি যদি এটি ব্যবহার করতে চলেছেন তবে নিশ্চিত হন যে "অ্যাপ_ফু" ডাটাবেস টেবিলের নাম, সুতরাং উদাহরণস্বরূপ: "মাইনাপ_প্রফাইল", "নাম" ডাটাবেসের পুরানো কলামের নাম (মডেল ক্ষেত্রের নাম নয়), উদাহরণস্বরূপ: "ইউজার_আইডি" এবং "পুরো নাম" হ'ল নতুন নামটি আপনি কলামটি রাখতে চান (আবার ডাটাবেস কলাম এবং ক্ষেত্রের নাম নয়)। সুতরাং: db.rename_column ('mainapp_profile', 'user_id', 'new_user_id') এছাড়াও, আপনি যদি বিদেশী কীগুলি নিয়ে কাজ করছেন তবে নাম পরিবর্তন করার সময় আপনার "_id" অংশ থাকা উচিত।
গিজিম

3
আপনি যদি এই db.rename_colوم ম্যানুয়ালি করেন তবে আপনার জিনিসগুলি ব্যাক আপ পরিষ্কার করার জন্য পরে একটি জাল স্কিমাইগ্রেশন করতে হবে। এটি প্রথমে কলামগুলির নাম পরিবর্তন করে পরিবর্তনটি স্থানান্তরিত করে। তারপরে মডেলটি ঠিক করুন (আপডেট হওয়া নামটি আছে) এবং তারপরে।
ডাঃ জিম্বোব

24
আপনি ./manage.py স্কিমাইগ্রেশন my_app পুনর্নবীকরণ_কালম_এক্স - খালি স্থানান্তর তৈরি করতে এবং কেবল কোডটি রাখতে এটি ব্যবহার করতে পারেন
ইলিয়ান ইলিভ

11
--empty বেশি সাহায্য করে না, পরিবর্তে --আউটো ​​ব্যবহার করে তৈরি মাইগ্রেশন পরিবর্তন করে। মডেল.পির পরবর্তী স্থানান্তরের জন্য এটি ক্ষেত্রটি মুছে ফেলা হয়েছে বলে দাবি করবে না।
ইয়াস্ক

39

আমি যা করি তা এখানে:

  1. আপনার মডেলটিতে কলামের নাম পরিবর্তন করুন (এই উদাহরণে এটি হবে myapp/models.py)
  2. চালান ./manage.py schemamigration myapp renaming_column_x --auto

নোটটি renaming_column_xআপনার পছন্দ মতো যে কোনও কিছু হতে পারে, এটি মাইগ্রেশন ফাইলটিতে বর্ণনামূলক নাম দেওয়ার একমাত্র উপায়।

এটি আপনাকে বলা একটি ফাইল তৈরি করবে myapp/migrations/000x_renaming_column_x.pyযা আপনার পুরানো কলামটি মুছবে এবং একটি নতুন কলাম যুক্ত করবে।

মাইগ্রেশন আচরণটি একটি সাধারণ নাম পরিবর্তনে পরিবর্তন করতে এই ফাইলের কোডটি পরিবর্তন করুন:

class Migration(SchemaMigration):

    def forwards(self, orm):
        # Renaming column 'mymodel.old_column_name' to 'mymodel.new_column_name'
        db.rename_column(u'myapp_mymodel', 'old_column_name', 'new_column_name')

    def backwards(self, orm):
        # Renaming column 'mymodel.new_column_name' to 'mymodel.old_column_name'
        db.rename_column(u'myapp_mymodel', 'new_column_name', 'old_column_name')

আপনার কমান্ডে কলামের নাম কি? xবা column_x?
andilabs

আপনি যে কমান্ডটির কথা উল্লেখ করছেন তার অংশটি কেবলমাত্র মাইগ্রেশনের নামকরণ করতে ব্যবহৃত হয়েছে, এটি আপনার পছন্দমতো হতে পারে। আপনি যখন এটি সম্পাদনা করবেন তখন মাইগ্রেশন ফাইলটিতে কলামের নাম নির্দিষ্ট করা দরকার।
স্বতঃস্ফূর্ততা

2
--autoপ্রথমে মাইগ্রেশন তৈরি করা একটি দুর্দান্ত টিপ। এটি দক্ষিণ ওআরএম ফ্রিজারের সমস্যাগুলি এড়ায়, যা মাইগ্রেশনটিতে কেবলমাত্র পদ্ধতি forwardsএবং backwardsপদ্ধতি থাকলে তবে হিমায়িত modelঅবজেক্টটি না থাকলে তা ঘটে ।
mwcz

আমি কীভাবে দক্ষিণের প্রশ্নের উত্তর দেব 'আপনি যেহেতু এই ক্ষেত্রটি সরিয়ে দিচ্ছেন, আপনার অবশ্যই একটি ডিফল্ট নির্দিষ্ট করা উচিত'?
ব্রাইস

3
এই পদ্ধতির সাথে আমার একটি সমস্যা হ'ল এটি হ'ল কলামের সাথে সম্পর্কিত সীমাবদ্ধতারdb.rename_column নাম পরিবর্তন করে । মাইগ্রেশনটি এখনও কাজ করবে তবে আপনার পুরানো কলামের নাম অনুসারে বাধা থাকবে। আমার একটি স্বতন্ত্রতা বাধা সহ একটি কলাম ছিল, এই পদ্ধতিটি ব্যবহার করে এটির পুনরায় নামকরণ করা হয়েছিল, পরীক্ষিত হয়েছিল যে স্বতন্ত্রতা বাধাটি এখনও বিদ্যমান এবং একটি ত্রুটি পেয়েছে তবে সীমাবদ্ধতার নামটি এখনও পুরানো কলামের নামটিই ব্যবহার করছিল। সম্ভবত একটি স্পষ্ট এবং এটি করতে হবে কিন্তু আমি sjh এর সমাধান সঙ্গে যেতে সিদ্ধান্ত নিয়েছে। db.delete_uniquedb.create_unique
লুই

15

আমি db.rename কলাম সম্পর্কে জানতাম না, সহজ মনে করি, তবে অতীতে আমি নতুন কলামটিকে একটি স্কিমেগাইগ্রেশন হিসাবে যুক্ত করেছি, তারপরে মানগুলিকে নতুন ক্ষেত্রে স্থানান্তরিত করার জন্য একটি ডেটামাইগ্রেশন তৈরি করেছি, তারপরে পুরাতন কলামটি মুছে ফেলার জন্য দ্বিতীয় স্কিমাইগ্রেশন


আমিও. স্কিমা-ডেটা-স্কিমা কৌশলটি হ'ল সমস্যাটি হ'ল আপনি নিজের ক্ষেত্রগুলি / মডেলগুলির জন্য বিভিন্ন নাম রেখেছেন। আপনি যদি প্রেরকদের সক্ষম করতে ক্যানোনিকাল নাম ব্যবহার করেন তবে কখনও কখনও এটি সমস্যা হয় ...
জনাথন

আমি কেবল এটি চেষ্টা করেছিলাম এবং কোনও নাম বিরোধের কারণে এটি কার্যকর হয়নি didn't আমার ঠিক একই এফকে কিন্তু আলাদা নাম ছিল। এটি বৈধতা দেয়নি। সুতরাং, এটি করবেন না
গিজিম

2
@ জোনাথন, তিনি আলাদা আলাদা নাম চান! ... @ পিলগ্রিম, কিছু কোড পোস্ট করার জন্য যত্নশীল? আমি এই সপ্তাহে বেশ কয়েকবার এটি করেছি, যদি আপনার মডেলগুলি বৈধতা না দেয় তবে দক্ষিণে মাইগ্রেশন তৈরি হবে না।
sjh

এটি কার্যকর হবে, তবে অন্যান্য লোকেরা প্রস্তাবিত 'পুনর্নাম_কলাম' এর চেয়ে সম্ভবত ধীর হবে। আমি জানি মাইএসকিউএল খুব দ্রুত একটি "অল্টার টেবিল ... নামকরণ কলাম" (বা এটি যাই হোক না কেন) করতে পারে।
ররি

1
@ ররি db.rename_columnআপনার পক্ষে সীমাবদ্ধতার নাম পরিবর্তন করবে না তাই আপনাকে ম্যানুয়ালি পরিচালনা করতে হবে। আপনি যদি এটি করতে ভুলে যান তবে মাইগ্রেশনটি কাজ করবে এটি অজানা আপনার ব্যতীত পুরানো কলামের নামটি এখনও ব্যবহার করতে পারে using আমার কাছে এটি স্পষ্ট নয় যে বিষয়টি কেবল কসমেটিকই হোক বা ভবিষ্যতের অভিবাসন যেখানে সীমাবদ্ধতা চালানো উচিত বা দক্ষিণে ফেলে দেওয়া উচিত তা সন্ধান করতে সক্ষম হবে না। যে কোনও হারে, এখানে sjh এর পরামর্শ অনুসারে এটি করা এটির নিরাপদ উপায়: আপনি দক্ষিণকে এটি নির্ধারণ করতে পারেন যে এটি কী হবে।
লুই

10

জাজানো ১.7 মাইগ্রেশন প্রবর্তন করেছিল তাই এখন আপনার মাইগ্রেশন পরিচালনা করতে আপনার অতিরিক্ত প্যাকেজ ইনস্টল করার দরকার নেই।

আপনার মডেলটির নাম পরিবর্তন করতে আপনাকে প্রথমে খালি মাইগ্রেশন তৈরি করতে হবে:

$ manage.py makemigrations <app_name> --empty

তারপরে আপনাকে আপনার মাইগ্রেশনের কোডটি এভাবে সম্পাদনা করতে হবে:

from django.db import models, migrations

class Migration(migrations.Migration):

dependencies = [
    ('yourapp', 'XXXX_your_previous_migration'),
]

operations = [
    migrations.RenameField(
        model_name='Foo',
        old_name='name',
        new_name='full_name'
    ),
    migrations.RenameField(
        model_name='Foo',
        old_name='rel',
        new_name='odd_relation'
    ),
]

এবং এর পরে আপনার চালানো দরকার:

$ manage.py migrate <app_name>

5

কেবলমাত্র মডেলটি পরিবর্তন করুন এবং makemigrations1.9 এ চালান

জ্যাঙ্গো স্বয়ংক্রিয়ভাবে সনাক্ত করে যে আপনি একটি একক ক্ষেত্র মুছে ফেলেছেন এবং তৈরি করেছেন এবং জিজ্ঞাসা করেছেন:

Did you rename model.old to model.new (a IntegerField)? [y/N]

হ্যাঁ বলুন, এবং সঠিক স্থানান্তর তৈরি হবে। ম্যাজিক।


0
  1. southপ্রকল্প সেটিং ফাইলটিতে আপনার ইনস্টল করা অ্যাপগুলিতে যুক্ত করুন Add
  2. যুক্ত / সংশোধিত ক্ষেত্র / সারণীটি মন্তব্য করুন।
  3. $ manage.py Schemamigration <app_name> --initial
  4. $ manage.py migrate <app_name> --Fake
  5. ক্ষেত্রটি আন-মন্তব্য করুন এবং পরিবর্তিতটি লিখুন
  6. $ manage.py Schemamigration --auto
  7. $ manage.py migrate <app_name>

আপনি যদি 'পাইচার্ম' ব্যবহার করেন তবে আপনি 'ম্যানেজ.পি' এর পরিবর্তে 'সিটিআরএল + শিফট + আর' এবং পরামিতিগুলির জন্য 'শিফট' ব্যবহার করতে পারেন।

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