Як змінити назву програми Django?


156

Я змінив назву програми в 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функція дуже допоможе вам у цьому.
Анто

1
Хіба Південь не підтримує таку операцію?
andilabs

Відповіді:


285

Виконайте наступні дії, щоб змінити ім’я програми в 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. Крім того, якщо у вас є моделі, вам доведеться перейменовувати таблиці моделей. Для використання постгресів 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.pyмета-класі 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

@ Рохан Чи є якась інформація, яку ви могли б надати, щоб детально пояснити, як міграції не вдалися?
meshy

Якщо ви запустите тест локально зі старими файлами міграції, ви побачите, що не вдасться створити таблиці @meshy
Рохан

1
Цей ігровий план для мене прекрасно працював. Поки кожен крок розгортається через усі активні каси (CI, інші розробники, виробництво тощо) до того, як буде вирішено наступний крок, він спрацював ідеально - жодних проблем із існуючими історичними міграціями. Виконайте дії в порядку та розповсюдьте зміни скрізь, перш ніж перейти до наступного кроку.
користувач85461

11

Якщо ви використовуєте PyCharm і проект перестає працювати після перейменування:

  1. Відредагуйте конфігурацію Run / Debug та змініть змінну середовища DJANGO_SETTINGS_MODULE, оскільки вона містить назву вашого проекту.
  2. Перейдіть у Налаштування / Мови та рамки / Django та оновіть файл налаштувань.

1
Це одна з тих ситуацій, коли знайти і замінити мене не вдалося. Дякуємо, що вказали на це.
ruaanvds

0

Підхід для повторної міграції для чистішої пластини.

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

  1. Резервне копіювання вашої бази даних. Скиньте всі таблиці за допомогою а) схеми даних + для можливих кругових залежностей та б) просто даних для перезавантаження.
  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.pyмета-класі 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 Code: "Замінити у файлах"

Ви просто введіть старе ім'я та нове ім'я та замініть Everyhting у проекті одним клацанням миші.

ПРИМІТКА . Це перейменує лише вміст файлу, а не імена файлів та папок. Не забудьте перейменувати папки, наприклад. templates/my_app_name/перейменувати його вtemplates/my_app_new_name/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.