Как изменить название приложения Django?


158

Я изменил название приложения в Django, переименовав его папку, импортировав все ссылки (шаблоны / индексы). Но теперь я получаю эту ошибку при попытке запуститьpython manage.py runserver

Error: Could not import settings 'nameofmynewapp.settings' (Is it on sys.path?): No module named settings

Как я могу отладить и устранить эту ошибку? Есть какие-нибудь подсказки?


Привет, Данихп. Да. Я также использую virtualenv, я не знаю, имеет ли это какое-то отношение.
— Андре

1
Если по какой-либо причине вы используете PyCharm, его renameфункция очень поможет вам в этом.
— Anto

1
Разве Юг не поддерживает такую ​​операцию?
— andilabs

Ответы:


287

Выполните следующие действия, чтобы изменить имя приложения в Django:

  1. Переименуйте папку, которая находится в корне вашего проекта
  2. Измените все ссылки на приложение в их зависимости, то есть приложения views.py, urls.py, «manage.py», иsettings.py файлы.
  3. Отредактируйте таблицу базы данных django_content_typeс помощью следующей команды:UPDATE django_content_type SET app_label='<NewAppName>' WHERE app_label='<OldAppName>'
  4. Также, если у вас есть модели, вам придется переименовать таблицы моделей. Для postgres использовать ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName. Для mysql я думаю, что это то же самое (как упомянуто @null_radix)
  5. (Для Джанго> = 1.7) Обновление django_migrationsтаблицы , чтобы избежать ваши предыдущие миграции повторно запустить: UPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>'. Примечание : есть некоторые споры (в комментариях), требуется ли этот шаг для Django 1.8+; Если кто-то знает наверняка, пожалуйста, обновите здесь.
  6. Если ваш models.pyMeta Class есть в app_nameсписке, обязательно переименуйте его тоже (упомянуто @will).
  7. Если вы разместили пространство имен в ваших приложениях staticили templatesпапках внутри приложения, вам также необходимо их переименовать. Например, переименуйте old_app/static/old_appвnew_app/static/new_app .
  8. Для переименования django modelsвам нужно изменить django_content_type.nameзапись в БД. Для использования PostgreSQLUPDATE django_content_type SET name='<newModelName>' where name='<oldModelName>' AND app_label='<OldAppName>'

Мета-точка (при использовании virtualenv): Стоит отметить, что если вы переименовываете каталог, содержащий ваш virtualenv, в вашем env, скорее всего, будет несколько файлов с абсолютным путем, которые также необходимо будет обновить. Если вы получаете такие ошибки, ImportError: No module named ...возможно, виновник. (спасибо @danyamachine за предоставленную информацию).

Другие ссылки: вы также можете обратиться к ссылкам ниже для более полной картины

  1. Переименование приложения с помощью Django и South
  2. Как перенести модель из одного приложения django в новое?
  3. Как изменить название приложения Django?
  4. Обратная миграция с Джанго Югом
  5. Самый простой способ переименовать модель, используя Django / South?
  6. Код Python (спасибо A.Raouf ) для автоматизации вышеуказанных шагов (непроверенный код. Вы были предупреждены!)
  7. Python-код (спасибо rafaponieman ) для автоматизации вышеуказанных шагов (непроверенный код. Вы были предупреждены!)

3
Также, если у вас есть модели, вам придется переименовать таблицы моделей. Для postgres используйте ALTER TABLE <oldAppName>_modelName RENAME TO <newAppName>_modelName
— null_radix

11
И если вы используете новые миграции, вам нужно изменить имя приложения в существующих файлах миграции и таблице django_migrations. Возможно, лучше сперва перенести миграцию, чтобы меньше редактировать.
— Джеймс

7
Для Postgres: если вы тоже хотите переименовать последовательность, используйте ALTER SEQUENCE <oldAppName>_<modelName>_<PK>_seq RENAME TO <newAppName>_<modelName>_<PK>_seq;. Хотя в этом нет необходимости, сама система не заботится об имени. В столбце DEFAULT хранится OID( 'foo_pkey_seq'::regclass), вы можете изменить имя последовательности, не прерывая ее - OID остается прежним.
— Константин Калбазов

3
Было бы здорово, если бы вы обновили свой ответ, включив в него то, что сказал Джеймс об обновлении файлов миграции (например, имен модулей зависимостей) ... не могли бы понять это довольно долго.
— U3L

2
Вот команда управления, которая позволяет переименовывать модель в соответствии с решением @ SrikarAppalaraju: gist.github.com/rafaponieman/201054ddf725cda1e60be3fe845850a5 Она принимает в качестве параметров old_name, new_name и классы (все они отформатированы так, как они выглядят в таблицах и полях базы данных).
— rafaponieman

32

Новое в Django 1.7 - это реестр приложений, который хранит конфигурацию и обеспечивает самоанализ. Этот механизм позволяет вам изменить несколько атрибутов приложения.

Главное, что я хочу сделать, это то, что переименование приложения не всегда необходимо: с помощью конфигурации приложения можно разрешать конфликтующие приложения. Но также и путь, если ваше приложение требует дружественных имен.

В качестве примера я хочу назвать свое приложение для опросов «Обратная связь с пользователями». Это выглядит так:

Создайте apps.pyфайл в pollsкаталоге:

from django.apps import AppConfig

class PollsConfig(AppConfig):
    name = 'polls'
    verbose_name = "Feedback from users"

Добавьте конфигурацию приложения по умолчанию к вашему polls/__init__.py:

default_app_config = 'polls.apps.PollsConfig'

Для дополнительной конфигурации приложения: https://docs.djangoproject.com/en/1.7/ref/applications/


13

Забавная проблема! Мне скоро придется переименовать много приложений, поэтому я пробовал.

Этот метод позволяет продвигаться в элементарных шагах, чтобы минимизировать сбои для других разработчиков, работающих над приложением, которое вы переименовываете.

Смотрите ссылку внизу этого ответа для рабочего примера кода.

  1. Подготовьте существующий код к переезду :
    • Создайте конфигурацию приложения (установите nameи labelпо умолчанию).
    • Добавьте конфигурацию приложения в INSTALLED_APPS.
    • На всех моделях явно установлено db_tableтекущее значение.
    • Доктор миграций, чтобы это db_tableбыло «всегда» четко определено.
    • Убедитесь, что миграция не требуется (проверяет предыдущий шаг).
  2. Изменить ярлык приложения :

    • Установите labelв настройках приложения новое имя приложения.
    • Обновите миграцию и внешние ключи для ссылки на новую метку приложения.
    • Обновление шаблонов для общих представлений на основе классов ( путь<app_label>/<model_name>_<suffix>.html по умолчанию - )
    • Запустите сырой SQL, чтобы исправить миграции и content_typesприложения (к сожалению, некоторый сырой SQL неизбежен). Вы не можете запустить это в миграции.

      UPDATE django_migrations
         SET app = 'catalogue'
       WHERE app = 'shop';
      
      UPDATE django_content_type
         SET app_label = 'catalogue'
       WHERE app_label = 'shop';
    • Убедитесь, что миграция не требуется (проверяет предыдущий шаг).

  3. Переименуйте таблицы :
    • Удалить "кастом" db_table.
    • Запустите, makemigrationsчтобы django мог переименовать таблицу «по умолчанию».
  4. Переместите файлы :
    • Переименуйте каталог модуля.
    • Исправить импорт.
    • Обновите конфигурацию приложения name.
    • Обновите, где INSTALLED_APPSссылки на конфигурацию приложения.
  5. Привести в порядок :
    • Удалите пользовательскую конфигурацию приложения, если она больше не требуется.
    • Если настройки приложения пропали, не забудьте также удалить их из INSTALLED_APPS.

Пример решения: я создал app-rename-example , пример проекта, в котором вы можете увидеть, как я переименовал приложение, по одному коммиту за раз.

В примере используются Python 2.7 и Django 1.8, но я уверен, что тот же процесс будет работать как минимум на Python 3.6 и Django 2.1.


1
Спасибо @meshy. Это действительно помогло мне переименовать огромное приложение. Одно из предложений: после запуска последней миграции вы можете удалить все файлы миграции и воссоздать исходный файл миграции, что поможет вам, если вы проводите непрерывное интеграционное тестирование, в противном случае CI не сможет создать тестовую базу данных.
— Рохан

Я написал это в ожидании того, что после завершения процесса миграции можно будет запускать с нуля. Если миграция не удалась, возможно, кто-то из нас что-то упустил. Я подумаю над этим и посмотрю, есть ли какие-то другие шаги, которые мне нужно добавить.
— меш

@ Рохан, есть ли какая-нибудь информация, которую вы могли бы предоставить, чтобы подробно описать, как произошла ошибка миграции?
— меш

Если вы запустите тестирование локально со старыми файлами миграции, вы увидите, что он не сможет создать таблицы @meshy
— Rohan

1
Этот план игры отлично сработал для меня. Пока каждый шаг развертывается через все активные проверки (CI, другие разработчики, производство и т. Д.) До того, как будет выполнен следующий шаг, он работал отлично - никаких проблем с существующими историческими миграциями. Выполните шаги по порядку и распространите изменения повсюду, прежде чем переходить к следующему шагу.
— user85461

11

Если вы используете PyCharm и проект перестает работать после переименования:

  1. Отредактируйте конфигурацию Run / Debug и измените переменную среды DJANGO_SETTINGS_MODULE, так как она включает имя вашего проекта.
  2. Перейдите в Настройки / Языки и рамки / Django и обновите расположение файла настроек.

1
Это одна из тех ситуаций, когда найти и заменить меня не удалось. Спасибо за указание на это.
— ruaanvds

0

Повторно мигрируйте подход для более чистой пластины.

Это можно сделать безболезненно, если другие приложения не используют модели внешних ключей из приложения для переименования. Проверьте и убедитесь, что их миграционные файлы не содержат никаких миграций из этого.

  1. Сделайте резервную копию вашей базы данных. Дамп всех таблиц с а) data + схема для возможных циклических зависимостей, и б) только данные для перезагрузки.
  2. Запустите ваши тесты.
  3. Проверьте весь код в VCS.
  4. Удалите таблицы базы данных приложения, которое нужно переименовать.
  5. Удалить разрешения: delete from auth_permission where content_type_id in (select id from django_content_type where app_label = '<OldAppName>')
  6. Удалить типы контента: delete from django_content_type where app_label = '<OldAppName>'
  7. Переименуйте папку приложения.
  8. Измените все ссылки на приложение в их зависимости, то есть приложения views.py, urls.py, «manage.py» иsettings.py файлы.
  9. Удалить миграции: delete from django_migrations where app = '<OldAppName>'
  10. Если ваш models.pyMeta Class есть в app_nameсписке, обязательно переименуйте его тоже (упомянуто @will).
  11. Если вы разместили пространство имен в ваших приложениях staticили templatesпапках внутри приложения, вам также необходимо их переименовать. Например, переименуйте old_app/static/old_appвnew_app/static/new_app .
  12. Если вы определили конфигурацию приложения в apps.py; переименуйте их и переименуйте их ссылки в настройках.INSTALLED_APPS
  13. Удалить файлы миграции.
  14. Повторите миграцию и мигрируйте.
  15. Загрузите данные таблицы из резервных копий.

0

Если вы используете Pycharm , переименование приложения очень просто с рефакторингом ( Shift+ по F6умолчанию) для всех файлов проекта.
Но обязательно удалите __pycache__папки в каталоге проекта и его подкаталогах. Также будьте осторожны, так как он также переименовывает комментарии, которые вы можете исключить в окне предварительного просмотра рефактора.
И вам придется переименовать OldNameConfig (AppConfig): в apps.pyвашем переименованном приложении в дополнение.

Если вы не хотите терять данные своей базы данных, вам придется вручную сделать это с запросом в базе данных, как вышеупомянутый ответ.


-3

Почему бы просто не использовать опцию «Найти и заменить». (у каждого редактора кода есть)?

Например, код Visual Studio (в разделе «Изменить»):

Параметр кода Visual Studio: «Заменить в файлах»

Вы просто вводите старое имя и новое имя и заменяете все в проекте одним щелчком мыши.

ПРИМЕЧАНИЕ . Это переименовывает только содержимое файла, а НЕ имена файлов и папок. Не забудьте переименовать папки, например. templates/my_app_name/переименуйте его вtemplates/my_app_new_name/

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.