2011-09-20 21 views
6

के बाद खो के बिना मेरे मॉडल है:एक Django मॉडल वर्ग नाम का नाम बदल रहा है और दक्षिण के साथ विदेशी कुंजी इसी, डेटा

class myUser_Group(models.Model): 
    name = models.CharField(max_length=100) 


class Channel(models.Model): 
    name = models.CharField(max_length=100) 
    description = models.CharField(max_length=1000) 
    belongs_to_group = models.ManyToManyField(myUser_Group) 

class Video(models.Model): 
    video_url = models.URLField(max_length=300) 
    belongs_to_channel = models.ManyToManyField(Channel) 
    description = models.CharField(max_length=1000) 
    tags = TagField() 

class UserProfile(models.Model): 
     user = models.OneToOneField(User) 

class User_History(models.Model): 
    date_time = models.DateTimeField() 
    user = models.ForeignKey(UserProfile, null=True, blank=True) 
    videos_watched = models.ManyToManyField(Video) 

मैं सिर्फ सभी वर्ग नामों से अंडरस्कोर को दूर करना चाहता था ताकि User_HistoryUserHistory दिखता है, विदेशी कुंजी भी अपडेट की जानी चाहिए। मैंने दक्षिण का उपयोग करने की कोशिश की लेकिन इसे दस्तावेज़ में नहीं मिला।

एक तरीका डेटा निर्यात करता है, दक्षिण की स्थापना रद्द करता है, माइग्रेशन हटाता है, तालिका का नाम बदलता है और फिर डेटा आयात करता है। क्या ऐसा करने का कोई और तरीका है?

+0

बदल गया है और आप इस व्यवस्थापक में किया चाहते हैं देखना चाहिए? यदि ऐसा है तो http://stackoverflow.com/questions/7413488/where-do-i-ustomize-the-heading-for-the-modeladmin-view/7414247#7414247 – Pannu

+0

मदद चाहिए, हाँ, बहुत सच है! लेकिन मुझे अभी भी पेप -8 के अनुपालन के लिए मॉडल नामों को बदलने की जरूरत है। – whatf

उत्तर

8

आप केवल दक्षिण का उपयोग करके ऐसा कर सकते हैं।

इस उदाहरण के लिए मैं एक ऐप्स निम्नलिखित मॉडल के साथ usergroups कहा जाता है:

class myUser_Group(models.Model): 
    name = models.CharField(max_length=100) 

जो मुझे लगता है दक्षिण के साथ प्रवास नियंत्रण में पहले से ही है।

मॉडल का नाम परिवर्तन करें:

class MyUserGroup(models.Model): 
    name = models.CharField(max_length=100) 

और दक्षिण

$ python manage.py schemamigration usergroups model_name_change --empty 

इस से एक खाली प्रवास आपको यह निर्दिष्ट करने के लिए क्या होता है एक कंकाल प्रवास फ़ाइल बनाएगा पैदा करते हैं। अगर हम इसे संपादित तो यह इस तरह दिखता है (इस फ़ाइल app_name/माइग्रेशन/फ़ोल्डर में होगा - usergroups/माइग्रेशन/इस मामले में):

import datetime 
from south.db import db 
from south.v2 import SchemaMigration 
from django.db import models 

class Migration(SchemaMigration): 

    def forwards(self, orm): 
     # Change the table name from the old model name to the new model name 
     # ADD THIS LINE (using the correct table names) 
     db.rename_table('usergroups_myuser_group', 'usergroups_myusergroup') 


    def backwards(self, orm): 
     # Provide a way to do the migration backwards by renaming the other way 
     # ADD THIS LINE (using the correct table names) 
     db.rename_table('usergroups_myusergroup', 'usergroups_myuser_group') 


    models = { 
     'usergroups.myusergroup': { 
      'Meta': {'object_name': 'MyUserGroup'}, 
      'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 
      'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) 
     } 
    } 

    complete_apps = ['usergroups'] 

forwards विधि में हम डेटाबेस तालिका नाम का नाम बदलने रहे हैं django ओआरएम नए मॉडल नाम के साथ क्या देखना होगा मिलान करने के लिए। यदि आवश्यक हो तो माइग्रेशन को वापस ले जाया जा सकता है यह सुनिश्चित करने के लिए हम backwards में परिवर्तन को उलट देते हैं।

आयात/मौजूदा डेटा को निर्यात करने की कोई जरूरत के साथ माइग्रेशन चलाएं:

$ अजगर की ओर पलायन manage.py

ही शेष कदम विदेशी कुंजी और कई-से-अनेक स्तंभों में अद्यतन करने के लिए है मॉडल जो myUser_Group को संदर्भित करते हैं और MyUserGroup को संदर्भित करने के लिए परिवर्तित करते हैं।

1

mmcnickle का समाधान काम कर सकता है और उचित लगता है लेकिन मुझे दो चरण की प्रक्रिया पसंद है। पहले चरण में आप तालिका का नाम बदलते हैं।

अपने मॉडल में वाकई में अपनी नई तालिका नाम दिया है:

class Meta: 
     db_table = new_table_name' 

फिर mmcnickle तरह का सुझाव दिया, एक कस्टम माइग्रेशन बनाएँ:

python manage.py schemamigration xyz migration_name --empty 

आप यहाँ के बारे में अधिक पढ़ सकते हैं: https://docs.djangoproject.com/en/dev/ref/models/options/

अब आपके कस्टम माइग्रेशन के साथ आपकी तालिका को आगे और पीछे की ओर बदलने के लिए लाइन भी जोड़ें:

db.rename_table("old_table_name","new_table_name") 

यह तालिका नाम माइग्रेट और बदलने के लिए पर्याप्त हो सकता है लेकिन यदि आप क्लास मेटा कस्टम टेबल नाम का उपयोग कर रहे हैं तो आपको थोड़ा और करना होगा। तो मैं एक नियम के रूप में कहूंगा, बस सुरक्षित होने के लिए "old_table_name" के लिए अपनी माइग्रेशन फ़ाइल में एक खोज करें और नई तालिका नाम में मिलने वाली किसी भी प्रविष्टि को बदलें। उदाहरण के लिए, यदि आपने पहले क्लास मेटा कस्टम तालिका नाम का इस्तेमाल कर रहे थे, आप की संभावना देखेंगे:

'Meta': {'object_name': 'ModelNameYouWillChangeNext', 'db_table': "u'old_table_name'"}, 

तो तुम नया एक के लिए है कि पुराने तालिका नाम को बदलना होगा। इस बिंदु के बाद से तुम सब किया है तालिका नाम बदल सकते हैं और Django बता नई तालिका नाम देखने के लिए है अपने अनुप्रयोग चलाना चाहिए पर

python manage.py migrate xyz 

:

अब आप के साथ माइग्रेट कर सकते हैं।

दूसरा चरण अपना मॉडल नाम बदलना है। इसकी कठिनाई वास्तव में आपके ऐप पर निर्भर करती है लेकिन मूल रूप से आपको केवल उस कोड को बदलने की आवश्यकता होती है जो पुराने मॉडल नाम को कोड में संदर्भित करता है जो नए मॉडल नाम का संदर्भ देता है। यदि आपने संगठन उद्देश्यों के लिए अपने पुराने मॉडल नाम का उपयोग किया है तो आपको शायद कुछ फ़ाइल नाम और निर्देशिका नामों को बदलने की भी आवश्यकता है।

ऐसा करने के बाद आपका ऐप ठीक चलना चाहिए। इस बिंदु पर आपका कार्य बहुत अधिक पूरा हो गया है और आपके ऐप को नए मॉडल नाम और नए टेबल नाम के साथ ठीक चलाना चाहिए। अगली बार जब आप इसकी ऑटो डिटेक्शन फीचर का उपयोग करके माइग्रेशन बनाते हैं तो अगली बार जब आप माइग्रेशन बनाते हैं तो पुरानी टेबल छोड़ने और स्क्रैच से नया बनाने का प्रयास करने की कोशिश की जाएगी क्योंकि यह आपके नए मॉडल नाम का पता चला है। इसे ठीक करने के आप एक और कस्टम माइग्रेशन बनाने की जरूरत:

python manage.py schemamigration xyz tell_south_we_changed_the_model_name_for_old_model_name --empty 

अच्छी बात यहाँ है आप के बाद से आप पहले से ही अपने मॉडल का नाम बदल दिया है ताकि दक्षिण इस ऊपर उठाता है कुछ भी नहीं। बस आगे और पीछे की "पास" विस्थापित में साथ विस्थापित:

python manage.py migrate xyz 

कुछ भी नहीं किया जाता है और दक्षिण अब यह अप टू डेट है एहसास है। प्रयास करें:

python manage.py schemamigration xyz --auto 

और आप यह पता लगाता है कुछ भी नहीं