python 重命名具有迁移功能的Django应用程序已经很糟糕。这是我发现的一种方法,可以保留您的旧迁移历史记录并保留

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 重命名具有迁移功能的Django应用程序已经很糟糕。这是我发现的一种方法,可以保留您的旧迁移历史记录并保留相关的知识,希望对你有一定的参考价值。

# -*- coding: utf-8 -*-

import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
from django.db.models import get_app, get_models


class Migration(SchemaMigration):

    # old_name => new_name
    apps_to_rename = {
        'some_old_app' : 'some_new_app',
        'another_old_app' : 'another_new_app'
    }

    def forwards(self, orm):

        for old_appname, new_appname in self.apps_to_rename.items():

            # Renaming model from 'Foo' to 'Bar'                  
            db.execute("UPDATE south_migrationhistory SET app_name = %s WHERE app_name = %s", [new_appname, old_appname])                                                                                                    
            db.execute("UPDATE django_content_type SET app_label = %s WHERE app_label = %s", [new_appname, old_appname])                                                                                                    
            
            app = get_app(new_appname)
            for model in get_models(app, include_auto_created=True):
                if model._meta.proxy == True:
                    continue

                new_table_name = model._meta.db_table
                old_table_name = old_appname + new_table_name[len(new_appname):] 
            
                db.rename_table(old_table_name, new_table_name)                                                                                                                        
        

    def backwards(self, orm):

        for old_appname, new_appname in self.apps_to_rename.items():
            # Renaming model from 'Foo' to 'Bar'                  
            db.execute("UPDATE south_migrationhistory SET app_name = %s WHERE app_name = %s", [old_appname, new_appname])                                                                                                    
            db.execute("UPDATE django_content_type SET app_label = %s WHERE app_label = %s", [old_appname, new_appname])                                                                                                    
            
            app = get_app(new_appname)
            for model in get_models(app, include_auto_created=True):
                if model._meta.proxy == True:
                    continue
                    
                old_table_name = model._meta.db_table
                new_table_name = old_appname + old_table_name[len(new_appname):] 
            
                db.rename_table(old_table_name, new_table_name)                                                                                                                        
            

以上是关于python 重命名具有迁移功能的Django应用程序已经很糟糕。这是我发现的一种方法,可以保留您的旧迁移历史记录并保留的主要内容,如果未能解决你的问题,请参考以下文章

如何重命名 Django 应用程序并将数据从一个应用程序迁移到另一个应用程序

重命名 Django 迁移文件是不是安全?

Django 1.8:删除/重命名数据迁移中的模型字段

text 使用django 1.7中的迁移重命名字段

Django 2.0.7 - 进行重命名字段迁移时出现语法错误

在 Django 中重命名模型(表)