Renaming an app with Django and South

前端 未结 6 778
栀梦
栀梦 2020-12-13 02:28

I am renaming an application to a more suitable name. In doing so, I want to ensure that South properly migrates the database (renames database tables and changes reference

6条回答
  •  情话喂你
    2020-12-13 02:42

    I agree with Laksham that you should avoid this situation. But sometimes, we have to. I've faced this situation in the past and I've managed it this way.

    If you want to avoid losing data you can dump the old application data into a json file.

    python manage.py dumpdata old_app --natural --indent=4 1> old_app.json
    

    Note the --natural option that will force the content types to be exported with their natural keys (app_name, model)

    Then you can create a small command to open this json file and to replace all the old_app references with the new_app.

    Something like this should work

    class Command(BaseCommand):
        help = u"Rename app in json dump"
    
        def handle(self, *args, **options):
            try:
                old_app = args[0]
                new_app = args[1]
                filename = args[2]
            except IndexError:
                print u'usage :', __name__.split('.')[-1], 'old_app new_app dumpfile.json'
                return
    
            try:
                dump_file = open(filename, 'r')
            except IOError:
                print filename, u"doesn't exist"
                return
    
            objects = json.loads(dump_file.read())
            dump_file.close()
    
            for obj in objects:
                obj["model"] = obj["model"].replace(old_app, new_app, 1)
    
                if obj["fields"].has_key("content_type") and (old_app == obj["fields"]["content_type"][0]):
                    obj["fields"]["content_type"][0] = new_app
    
            dump_file = open(filename, 'w')
            dump_file.write(json.dumps(objects, indent=4))
            dump_file.close()
    

    Then rename the application, change the name in INSTALLED_APPS.

    Then, you should remove all south migrations, regenerate and apply an initial migration for the new app. Then run the SQL command:

    update django_content_type set app_label='new_app' where app_label='old_app'
    

    Then launch a south migrate for the new app in order to create the tables and load the json file.

    python manage.py loaddata old_app.json
    

    I've done something similar on a project and it seems to work ok.

    I hope it helps

提交回复
热议问题