Как изменить название приложения 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/

allcaps
источник
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/

elano7
источник