Я согласен с Лакшамом, что вам следует избегать этой ситуации. Но иногда мы должны. Я сталкивался с такой ситуацией в прошлом, и мне удалось справиться с этим.
Если вы хотите избежать потери данных, вы можете сбросить данные старого приложения в файл json.
python manage.py dumpdata old_app --natural --indent=4 1> old_app.json
Обратите внимание на параметр --natural, который заставляет типы контента экспортироваться с их естественными ключами (app_name, model)
Затем вы можете создать небольшую команду, чтобы открыть этот файл json и заменить все ссылки на old_app на new_app.
Как-то так должно работать
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()
Затем переименуйте приложение, измените имя в INSTALLED_APPS.
Затем вы должны удалить все миграции на юг, восстановить и применить начальную миграцию для нового приложения. Затем выполните команду SQL:
update django_content_type set app_label='new_app' where app_label='old_app'
Затем запустите миграцию на юг для нового приложения, чтобы создать таблицы и загрузить файл json.
python manage.py loaddata old_app.json
Я сделал что-то похожее в проекте, и, кажется, он работает нормально.
Надеюсь, это поможет