Как вы думаете, это правильный способ переименовать приложение django?
Я читал различные темы и руководства по переименованию и миграции приложений Django (Как переименовать приложение Django и перенести данные из одного приложения в другое например), я также пытался использовать пакет django под названием django-rename-app, но он не сработал вообще.
Я собираюсь объяснить, как я переименовал свое приложение в среде разработки, и хотел бы знать, ожидаете ли вы проблем, поскольку, по-видимому, все работает так же, как и раньше, поэтому я подумываю сделать то же самое в продакшене.
Вот шаги, которые я предпринял внутри моего корневого каталога проекта и активированного virtualenv, используя Django 3.2:
Создайте целевое приложение
django-admin startapp app2
Скопируйте эти файлы и каталоги
cp app1/*.py app2/
mkdir app2/templates
mkdir app2/static
cp app1/templates app2/templates
В этом случае у меня была подпапка, названная в честь приложения, поэтому я переименовал ее следующим образом
mv app2/templates/app1 app2/templates/app2
cp app1/static app2/static
Models.py
Измените атрибуты related_name всех ForeignKeys в моем новом models.py и обновите все их ссылки в моих представлениях, админке, форме и шаблонах
Активируйте новое приложение
Добавьте мое приложение app2 в список включенных приложений в settings.py
Удалить pycache
Найдите и удалите или опустошите все каталоги pycache в app2
Миграции
это не будет работать, пока все перекрывающиеся биты не будут исправлены, поэтому так я проверял, что все в порядке (на этом этапе он не будет знать о проблеме URLs)
python manage.py makemigrations
python manage.py migrate
Клонирование данных
Теперь я использовал оболочку Django для миграции данных из app1 в app2
python manage.py shell
import app1
from app2.models import *
Таким образом, мне придется использовать "app1.ModelName" для обращения к старому приложению и просто "ModelName" для обращения к новым экземплярам app2
Затем я использую Models and QuerySet API для простого создания новых объектов в app2 с циклами for для каждого экземпляра app1, с соответствующим объектом app2, который сохраняется (это должно быть написано индивидуально и зависит от каждой ситуации)
Деактивируйте старое приложение
Теперь я удаляю и комментирую старую ссылку app1 в settings.py так, чтобы она была отключена
Переименовать директорию
На этом этапе мне нужно было переименовать каталог app1/ во что-то неизвестное Django
mv app1 app1_
Обработайте новые ошибки
Похоже, здесь появилось еще несколько ошибок с URLS и Views, поэтому мне пришлось просто обновить ссылки app1 на app2, пока они не исчезли
Удалить таблицу базы данных
Войдите в MySQL (в моем случае), и отключите FOREIGN_KEY_CHECKS
USE yourowndjangodatabase;
ПОКАЗАТЬ ТАБЛИЦЫ;
SET FOREIGN_KEY_CHECKS=0;
теперь я могу удалить их следующим образом
DROP TABLE app1__yourfirstmodel;
DROP TABLE app1__yoursecondmodel;
и так далее, пока не останется ни одного, затем установите FOREIGN_KEY_CHECKS обратно в 1, чтобы он был включен
SET FOREIGN_KEY_CHECKS=1;
Как я видел Невозможно уничтожить таблицу: Ограничение внешнего ключа не работает
ВЫВОД
И в основном это было все, это прекрасно работало для моей среды разработки. У меня есть идеальная копия моего предыдущего приложения app1 и веб-приложения, которое теперь просто использует app2.
Я импровизировал, поэтому я не уверен, что это правильная процедура, но она сработала, поэтому я хотел бы спросить, видите ли вы какие-либо проблемы или подозреваете, что будут проблемы в производстве.