Django как переименовать приложение
Как я могу отладить и решить эту ошибку? Любые подсказки?
Привет, Данихп. Да, у меня есть. Я также использую virtualenv, я не знаю, имеет ли это какое-то отношение. Если по какой-либо причине вы используете PyCharm, его функция rename поможет вам в этом.3 ответа
Чтобы изменить имя приложения в Django, выполните следующие действия:
- Переименуйте папку, которая находится в корневом каталоге проекта
- Измените любые ссылки на ваше приложение в своих зависимостях, то есть файлы приложений views.py , urls.py , 'manage.py' и settings.py .
- Измените таблицу базы данных django_content_type следующей командой: UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
- Также, если у вас есть модели, вам придется переименовать таблицы моделей. Для postgres используйте ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName . Для mysql тоже я думаю, что это то же самое (как упоминалось @null_radix)
- (Для Django >= 1.7) Обновите таблицу django_migrations , чтобы избежать повторного запуска предыдущих миграций: UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>' . Примечание: есть некоторые дебаты (в комментариях), если этот шаг необходим для Django 1.8+; Если кто-то знает наверняка, пожалуйста, обновите здесь.
- Если ваш метатег models.py содержит app_name , обязательно переименуйте его тоже (упомянутый @will).
- Если у вас есть namespaced ваши папки static или templates внутри вашего приложения, вам также нужно будет переименовать их. Например, переименуйте old_app/static/old_app в new_app/static/new_app .
- Для переименования django models вам нужно будет изменить запись django_content_type.name в БД. Для postgreSQL используйте UPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'
Мета-точка (если используется virtualenv): Стоит отметить, что если вы переименовываете каталог, содержащий ваш virtualenv, вероятно, будет несколько файлов в вашем env, которые содержат абсолютный путь, а также понадобятся быть обновленным. Если вы получаете ошибки, такие как ImportError: No module named . , это может быть преступником. (благодаря @danyamachine для обеспечения этого).
Другие ссылки:, вы также можете ссылаться на приведенные ниже ссылки для более полного изображения
Как я могу отладить и решить эту ошибку? Любые подсказки?
Чтобы изменить имя приложения в Django, выполните следующие действия:
- Переименуйте папку, которая находится в корневом каталоге проекта
- Измените любые ссылки на ваше приложение в своих зависимостях, то есть файлы приложений views.py , urls.py , 'manage.py' и settings.py .
- Измените таблицу базы данных django_content_type следующей командой: UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
- Также, если у вас есть модели, вам придется переименовать таблицы моделей. Для postgres используйте ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName . Для mysql тоже я думаю, что это то же самое (как упоминалось @null_radix)
- (Для Django >= 1.7) Обновите таблицу django_migrations , чтобы избежать повторного запуска предыдущих миграций: UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>' . Примечание: есть некоторые дебаты (в комментариях), если этот шаг необходим для Django 1.8+; Если кто-то знает наверняка, пожалуйста, обновите здесь.
- Если ваш метатег models.py содержит app_name , обязательно переименуйте его тоже (упомянутый @will).
- Если у вас есть namespaced ваши папки static или templates внутри вашего приложения, вам также нужно будет переименовать их. Например, переименуйте old_app/static/old_app в new_app/static/new_app .
- Для переименования django models вам нужно будет изменить запись django_content_type.name в БД. Для postgreSQL используйте UPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'
Мета-точка (если используется virtualenv): Стоит отметить, что если вы переименовываете каталог, содержащий ваш virtualenv, вероятно, будет несколько файлов в вашем env, которые содержат абсолютный путь, а также понадобятся быть обновленным. Если вы получаете ошибки, такие как ImportError: No module named . , это может быть преступником. (благодаря @danyamachine для обеспечения этого).
Другие ссылки:, вы также можете ссылаться на приведенные ниже ссылки для более полного изображения
- Переименование приложения с помощью Django и South
- Как перенести модель из одного приложения django и в новое?
- Как изменить имя приложения Django?
- Обратная миграция с Django South
- Самый простой способ переименовать модель с помощью Django/South?
- код Python (благодаря A.Raouf), чтобы автоматизировать вышеуказанное шаги (неактивный код. Вы были предупреждены!)
- код Python (благодаря rafaponieman), чтобы автоматизировать вышеуказанное шаги (неактивный код. Вы были предупреждены!)
Новое в Django 1.7 - это реестр приложений, который хранит конфигурацию и обеспечивает интроспекцию. Этот механизм позволяет изменять несколько атрибутов приложения.
Главное, что я хочу сделать, это то, что переименование приложения не всегда необходимо: при конфигурации приложения можно разрешать конфликтующие приложения. Но и путь, если ваше приложение нуждается в дружественном наименовании.
В качестве примера я хочу назвать свое приложение опросов "Обратная связь с пользователями". Это происходит следующим образом:
Как я могу отладить и решить эту ошибку? Есть зацепки?
выполните следующие действия, чтобы изменить имя приложения в Django:
- переименуйте папку, которая находится в корне вашего проекта
- измените любые ссылки на ваше приложение в своих зависимостях, т. е. приложение views.py , urls.py , 'manage.py-и еще!--2--> файлы.
- изменить таблицу базы данных django_content_type со следующей командой: UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
- кроме того, если у вас есть модели, вам придется переименовать таблицы моделей. Для postgres используйте ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName . для MySQL я тоже думаю, что это то же самое (как упоминалось @null_radix)
- (для Django >= 1.7) обновление django_migrations таблица, чтобы избежать повторного запуска предыдущих миграций: UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>' . Примечание: есть некоторые дебаты (в комментариях) если этот шаг необходим для Django 1.8+; если кто-то знает наверняка, пожалуйста, здесь.
- если models.py мета-класс имеет app_name в списке, убедитесь, что переименовать это тоже (упоминается @will).
- если у вас есть пространство имен static или templates папки внутри вашего приложения, вам также необходимо переименовать их. Например, переименовать old_app/static/old_app to new_app/static/new_app .
- для переименования django models , вам нужно будет изменить django_content_type.name запись в БД. Для postgreSQL используйте UPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'
Meta point (при использовании virtualenv): стоит отметить, что если вы переименовываете каталог, содержащий ваш virtualenv, в вашем env, вероятно, будет несколько файлов, которые содержат абсолютный путь и будут также необходимо обновить. Если вы получаете такие ошибки, как ImportError: No module named . это может быть виновником. (спасибо @danyamachine за предоставление этого).
другие ссылки: вы также можете обратиться к приведенным ниже ссылкам для более полной картины
New In Django 1.7-это реестр приложений, который хранит конфигурацию и обеспечивает самоанализ. Это оборудование позволяет вам изменить несколько атрибутов приложения.
главное, что я хочу сделать, это то, что переименование приложения не всегда необходимо: с конфигурацией приложения можно разрешить конфликтующие приложения. Но и способ пойти, если ваше приложение нуждается в дружественном именовании.
в качестве примера я хочу назвать мое приложение опросов "обратная связь от пользователей". Оно идет как это:
добавьте конфигурацию приложения по умолчанию в свой polls/__init__.py :
в случае, если вы используете PyCharm и проект перестает работать после переименования:
- изменить конфигурацию запуска / отладки и изменить переменную среды DJANGO_SETTINGS_MODULE, так как она включает имя вашего проекта.
- перейдите в раздел Настройки / языки и фреймворки / Django и обновите расположение файла настроек.
проблема, удовольствие! Скоро мне придется переименовать много приложений, поэтому я сделал сухой прогон.
этот метод позволяет добиться прогресса в атомарных шагах, чтобы свести к минимуму нарушения для других разработчиков, работающих над приложением, которое вы переименовываете.
см. ссылку в нижней части этого ответа для пример рабочего кода.
- подготовить существующий код для переезда:
- создать конфигурацию приложения (set name и label по умолчанию).
- добавить приложение. config для INSTALLED_APPS .
- на всех моделях явно установить db_table к текущему значению.
- доктор миграции так что db_table "всегда" четко определено.
- убедитесь, что миграция не требуется (проверяет предыдущий шаг).
изменить ярлык приложения:
- Set label в app config в новое приложение имя.
- обновление миграций и внешних ключей для ссылки на новую метку приложения.
- обновить шаблоны для общих представлений на основе классов (путь по умолчанию: <app_label>/<model_name>_<suffix>.html )
убедитесь, что миграция не требуется (проверяет предыдущий шаг).
- удалить "custom" db_table .
- выполнить makemigrations таким образом, django может переименовать таблицу "по умолчанию".
- переименовать каталог модулей.
- исправление импорта.
- Обновить конфигурацию приложения name .
- обновить, где INSTALLED_APPS ссылки на конфигурации приложения.
- удалите настраиваемую конфигурацию приложения, если она больше не требуется.
- если app config ушел, не забудьте также удалить его из INSTALLED_APPS .
пример решения: я создал app-переименовать-пример, пример проекта, где вы можете увидеть, как я переименовал приложение, по одному фиксации за раз.
в примере используется Python 2.7 и Django 1.8, но я уверен, что тот же процесс будет работать как минимум на Python 3.6 и Django 2.1.
перенастройка подхода для более чистой пластины.
это можно безболезненно сделать, если другие приложения не внешние модели ключей из приложения, которое будет переименовано. Проверьте и убедитесь, что их файлы миграции не перечисляют никаких миграций из этого.
Как я могу отладить и устранить эту ошибку? Есть какие-нибудь подсказки?
Привет, Данихп. Да. Я также использую virtualenv, я не знаю, имеет ли это какое-то отношение. Если по какой-либо причине вы используете PyCharm, его rename функция очень поможет вам в этом.Выполните следующие действия, чтобы изменить имя приложения в Django:
- Переименуйте папку, которая находится в корне вашего проекта
- Измените все ссылки на приложение в их зависимости, то есть приложения views.py , urls.py , «manage.py», и settings.py файлы.
- Отредактируйте таблицу базы данных django_content_type с помощью следующей команды: UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
- Также, если у вас есть модели, вам придется переименовать таблицы моделей. Для postgres использовать ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName . Для mysql я думаю, что это то же самое (как упомянуто @null_radix)
- (Для Джанго> = 1.7) Обновление django_migrations таблицы , чтобы избежать ваши предыдущие миграции повторно запустить: UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>' . Примечание : есть некоторые споры (в комментариях), требуется ли этот шаг для Django 1.8+; Если кто-то знает наверняка, пожалуйста, обновите здесь.
- Если ваш models.py Meta Class есть в app_name списке, обязательно переименуйте его тоже (упомянуто @will).
- Если вы разместили пространство имен в ваших приложениях static или templates папках внутри приложения, вам также необходимо их переименовать. Например, переименуйте old_app/static/old_app в new_app/static/new_app .
- Для переименования django models вам нужно изменить django_content_type.name запись в БД. Для использования PostgreSQL UPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'
Мета-точка (при использовании virtualenv): Стоит отметить, что если вы переименовываете каталог, содержащий ваш virtualenv, в вашем env, скорее всего, будет несколько файлов с абсолютным путем, которые также необходимо будет обновить. Если вы получаете такие ошибки, ImportError: No module named . возможно, виновник. (спасибо @danyamachine за предоставленную информацию).
Другие ссылки: вы также можете обратиться к ссылкам ниже для более полной картины
Также, если у вас есть модели, вам придется переименовать таблицы моделей. Для postgres используйте ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName И если вы используете новые миграции, вам нужно изменить имя приложения в существующих файлах миграции и таблице django_migrations. Возможно, лучше сперва перенести миграцию, чтобы меньше редактировать. Для Postgres: если вы тоже хотите переименовать последовательность, используйте ALTER SEQUENCE <oldAppName>_<modelName>_<PK>_seq RENAME TO <newAppName>_<modelName>_<PK>_seq; . Хотя в этом нет необходимости, сама система не заботится об имени. В столбце DEFAULT хранится OID ( 'foo_pkey_seq'::regclass ), вы можете изменить имя последовательности, не прерывая ее - OID остается прежним. Было бы здорово, если бы вы обновили свой ответ, включив в него то, что сказал Джеймс об обновлении файлов миграции (например, имен модулей зависимостей) . не могли бы понять это довольно долго.Новое в Django 1.7 - это реестр приложений, который хранит конфигурацию и обеспечивает самоанализ. Этот механизм позволяет вам изменить несколько атрибутов приложения.
Главное, что я хочу сделать, это то, что переименование приложения не всегда необходимо: с помощью конфигурации приложения можно разрешать конфликтующие приложения. Но также и путь, если ваше приложение требует дружественных имен.
В качестве примера я хочу назвать свое приложение для опросов «Обратная связь с пользователями». Это выглядит так:
Создайте apps.py файл в polls каталоге:
Добавьте конфигурацию приложения по умолчанию к вашему polls/__init__.py :
Забавная проблема! Мне скоро придется переименовать много приложений, поэтому я пробовал.
Этот метод позволяет продвигаться в элементарных шагах, чтобы минимизировать сбои для других разработчиков, работающих над приложением, которое вы переименовываете.
Смотрите ссылку внизу этого ответа для рабочего примера кода.
- Подготовьте существующий код к переезду :
- Создайте конфигурацию приложения (установите name и label по умолчанию).
- Добавьте конфигурацию приложения в INSTALLED_APPS .
- На всех моделях явно установлено db_table текущее значение.
- Доктор миграций, чтобы это db_table было «всегда» четко определено.
- Убедитесь, что миграция не требуется (проверяет предыдущий шаг).
Изменить ярлык приложения :
- Установите label в настройках приложения новое имя приложения.
- Обновите миграцию и внешние ключи для ссылки на новую метку приложения.
- Обновление шаблонов для общих представлений на основе классов ( путь <app_label>/<model_name>_<suffix>.html по умолчанию - )
Убедитесь, что миграция не требуется (проверяет предыдущий шаг).
Пример решения: я создал app-rename-example , пример проекта, в котором вы можете увидеть, как я переименовал приложение, по одному коммиту за раз.
В примере используются Python 2.7 и Django 1.8, но я уверен, что тот же процесс будет работать как минимум на Python 3.6 и Django 2.1.
Как-то в бекенде школы меня перестало устраивать название приложения в Django. Всё просто — когда я начинал проект, я продавал только курсы, и приложение с моделями курсов называлось courses. Потом появились записи этих курсов (record) и наборы (bundles). Конечно мне захотелось переименовать приложение courses в products, чтобы уменьшить когнитивную нагрузку при чтении кода.
К сожалению, я не нашёл ни одного решения, кроме стрёмного django-rename-app, который предлагал мне выполнять management-команды в консольке на проде. Кроме того, что это ломает любые пайплайны CI\CD, там ещё и код был не очень понятный. Так что в итоге я решил сделать это сам. Оказалось сложно, поэтому я написал эту инструкцию.
Все изменения я делал на живом проекте, так что примеры будем брать прямо из пулл-реквестов.
- Подменяем имя приложения в истории миграций: ./manage.py makemigrations <some-other-app> -n RenameOldApp --empty . Коммит.
- Деплоим миграцию на прод. После этого шага ничего нельзя деплоить до конца.
- Делаем новый пулл-реквест.
- Переименовываем папку с приложением: git mv courses products
- Заменяем все упоминания старого приложения в миграциях. Коммит.
- У всех моделей в новом приложения в Meta прописываем db_table с именем старого приложения. В моём случае, если модель называется bundle и лежала в приложении courses, нужно прописать db_table = 'courses_bundle' . Коммит.
- В старых миграциях, которые используют операцию CreateTable , добавляем новую db_table в options . Коммит.
- Меняем упоминания приложения в коде, можно автозаменой. Коммит.
- Проверяем, ./manage.py makemigrations --check . Новых автоматических миграцией был не должно, ошибок тоже.
- Деплоим на прод.
В итоге у нас получается два деплоя. Первый подменяет миграции, а второй — код. В результате модели будут лежать по новому адресу, но ходить в старые таблицы. Для меня это было плюсом, т.к. не пришлось переделывать аналитические SQL-запросы, которые ходят в базу из Metabase.
Меня зовут Федя Борщёв. Пишу для программистов в телеграме — 3 поста в неделю об управлении сложными проектами, хорошем коде и профессиональном развитии. А ещё я в прямом эфире пишу код на ютубе и выкладываю всякое в фейсбук. Подписывайтесь!
Читайте также: