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機能が非常に役立ちます。
Anto

1
サウスはそのような操作をサポートしていませんか?
andilabs 2014

回答:


285

Djangoでアプリの名前を変更するには、次の手順に従います。

  1. プロジェクトのルートにあるフォルダの名前を変更します
  2. 依存関係にあるアプリへの参照をすべて変更します。 views.pyurls.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. (Djangoの場合> = 1.7)django_migrations以前のマイグレーションが再実行されないように、テーブルを更新しますUPDATE django_migrations SET app='<NewAppName>' WHERE app='<OldAppName>':Django 1.8以降でこの手順が必要かどうかについては、(コメントで)いくつかの議論があります。誰かが確実に知っている場合は、ここで更新してください。
  6. もしあなたの models.pyapp_nameメタクラスがリストされている場合は、必ず名前も変更してください(@willで言及)。
  7. あなたの名前空間した場合staticまたはtemplatesあなたのアプリ内のフォルダを、あなたはまた、これらの名前を変更する必要があります。たとえば、に名前old_app/static/old_appを変更しnew_app/static/new_appます。
  8. djangoの名前modelsを変更django_content_type.nameするには、DBのエントリを変更する必要があります。postgreSQLを使用する場合UPDATE 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. モデルを1つのdjangoアプリから新しいアプリに移行するにはどうすればよいですか?
  3. Djangoアプリの名前を変更するには?
  4. Django Southによる後方移行
  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 は変わりません。
Konstantine Kalbazov

3
ジェームズが移行ファイルのアップグレードについて述べた内容(依存関係モジュール名など)を含めるように回答を更新した場合、すばらしいでしょう...少しはわかりませんでした。
u3l 2015

2
ここでSrikarAppalarajuのソリューション@に従ってリネームモデルが可能になります管理コマンドです: gist.github.com/rafaponieman/201054ddf725cda1e60be3fe845850a5 それはパラメータとしてOLD_NAME、NEW_NAMEとクラスを(彼らは、データベースのテーブルとフィールド上に見えるように、すべてのフォーマット済み)受け入れます。
rafaponieman 2017

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. 移動のために既存のコードを準備します
    • 作成アプリの設定(設定namelabelデフォルトにします)。
    • アプリ構成をに追加しINSTALLED_APPSます。
    • すべてのモデルで、明示的db_tableに現在の値に設定します。
    • db_table「常に」明示的に定義された医師の移行。
    • 移行が必要ないことを確認します(前のステップを確認します)。
  2. アプリのラベルを変更します。

    • 設定するlabel新しいアプリ名にアプリの設定で。
    • 新しいアプリラベルを参照するように移行と外部キーを更新します。
    • 一般的なクラスベースのビューのテンプレートを更新します(デフォルトのパスはです<app_label>/<model_name>_<suffix>.html
    • raw SQLを実行して、移行とcontent_typesアプリを修正します(残念ながら、一部のraw 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ます。
    • makemigrationsdjangoがテーブルの名前を「デフォルト」に変更できるように実行します。
  4. ファイルを移動します
    • モジュールディレクトリの名前を変更します。
    • インポートを修正します。
    • アプリの設定を更新しますname
    • INSTALLED_APPSアプリの設定を参照する場所を更新します。
  5. 片付け
    • 不要になったカスタムアプリ構成を削除します。
    • アプリの設定がなくなった場合は、からも削除することを忘れないでくださいINSTALLED_APPS

ソリューションの例:app-rename-exampleを作成しました。これは、一度に1つのコミットでアプリの名前を変更する方法を確認できるサンプルプロジェクトです。

この例ではPython 2.7とDjango 1.8を使用していますが、同じプロセスが少なくともPython 3.6とDjango 2.1でも機能すると確信しています。


1
@meshyに感謝します。巨大なアプリの名前を変更するのに本当に役立ちました。1つの提案として、最後の移行を実行した後、すべての移行ファイルを削除して初期移行ファイルを再作成すると、継続的な統合テストを行う場合に役立ちます。そうしないと、CIがテストデータベースを作成できません。
Rohan

プロセスが完了したら、マイグレーションを最初から実行できることを期待して、これを書きました。移行が失敗した場合、おそらく私たちの1人が何かを逃しました。私はそれについて考え、追加する必要がある他のステップがあるかどうかを確認します。
メッシュ状

@Rohanは、移行がどのように失敗したかを正確に詳しく説明するために提供できる情報はありますか?
メッシュ状

古い移行ファイルを使用してローカルでテストを実行すると、テーブル@meshyの作成に失敗することがわかります
Rohan

1
このゲームプランは完璧に機能しました。次のステップに取り組む前に、各ステップがすべてのアクティブなチェックアウト(CI、他の開発者、本番など)を通じてデプロイされている限り、それは完全に機能しました。既存の過去の移行に問題はありません。次の手順に進む前に、手順を順番に実行し、変更をどこにでも伝達してください。
user85461

11

PyCharmを使用していて、プロジェクトが名前変更後に機能しなくなった場合:

  1. プロジェクト名が含まれているため、実行/デバッグ構成を編集し、環境変数DJANGO_SETTINGS_MODULEを変更します。
  2. 設定/言語とフレームワーク/ Djangoに移動し、設定ファイルの場所を更新します。

1
これは、検索と置換が失敗した状況の1つです。これを指摘してくれてありがとう。
ruaanvds 2018

0

クリーナープレートのアプローチを再移行します。

これは、他のアプリが名前を変更するアプリの外部キーモデルを使用していない場合でも、簡単に実行できます。移行ファイルに、このファイルからの移行がリストされていないことを確認してください。

  1. データベースをバックアップします。すべてのテーブルをダンプします。a)循環依存関係の可能性があるデータ+スキーマ、およびb)リロード用のデータのみ。
  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.pyurls.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でapp configを定義した場合、それらの名前を変更し、settings.INSTALLED_APPSで参照の名前を変更します。
  13. 移行ファイルを削除します。
  14. マイグレーションを再作成して、マイグレーションします。
  15. バックアップからテーブルデータを読み込みます。

0

Pycharmを使用している場合、すべてのプロジェクトファイルのリファクタリングShift+ F6デフォルト)を使用すると、アプリの名前を変更するのが非常に簡単です。
ただし__pycache__、プロジェクトディレクトリとそのサブディレクトリ内のフォルダは必ず削除してください。また、コメントの名前も変更されるため、リファクタプレビューウィンドウで除外できるので注意してください。
さらに、OldNameConfig(AppConfig)の名前を変更する必要がapps.pyあります。

データベースのデータを失いたくない場合は、前述の回答のようにデータベース内のクエリを使用して手動で行う必要があります。


-3

[検索と置換]オプションを使用しないのはなぜですか。(すべてのコードエディターが持っています)?

たとえば、Visual Studio Code(編集オプションの下):

Visual Studio Codeオプション: 'Replace in files'

古い名前と新しい名前を入力して、プロジェクト内のすべてをワンクリックで置き換えるだけです。

:これにより、ファイル名のみが変更され、ファイル名やフォルダ名は変更されません。フォルダの名前を変更することを忘れないでください。templates/my_app_name/名前をtemplates/my_app_new_name/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.