1. ホーム
  2. django

[解決済み] あるdjangoアプリから新しいアプリにモデルを移行するにはどうしたらいいですか?

2022-07-18 16:19:05

質問

私は、4つのモデルを含むdjangoアプリを持っています。これらのモデルの1つは、別のアプリにあるべきであることに今気づきました。私は移行のために南をインストールしましたが、私はこれが自動的に処理できるものではないと思います。どのようにすれば、古いアプリから新しいアプリにモデルの1つを移行することができますか?

また、本番システムなどを移行できるように、これが反復可能なプロセスであることが必要であることを心に留めておいてください。

どのように解決するのですか?

南を使用して移行する方法。

共通と特定の2つのアプリがあるとします。

myproject/
|-- common
|   |-- migrations
|   |   |-- 0001_initial.py
|   |   `-- 0002_create_cat.py
|   `-- models.py
`-- specific
    |-- migrations
    |   |-- 0001_initial.py
    |   `-- 0002_create_dog.py
    `-- models.py

ここで、モデル common.models.cat を特定のアプリに(正確には specific.models.cat に)移動させたいと思います。 まず、ソースコードに変更を加えてから実行します。

$ python manage.py schemamigration specific create_cat --auto
 + Added model 'specific.cat'
$ python manage.py schemamigration common drop_cat --auto
 - Deleted model 'common.cat'

myproject/
|-- common
|   |-- migrations
|   |   |-- 0001_initial.py
|   |   |-- 0002_create_cat.py
|   |   `-- 0003_drop_cat.py
|   `-- models.py
`-- specific
    |-- migrations
    |   |-- 0001_initial.py
    |   |-- 0002_create_dog.py
    |   `-- 0003_create_cat.py
    `-- models.py

ここで、両方のマイグレーションファイルを編集する必要があります。

#0003_create_cat: replace existing forward and backward code
#to use just one sentence:

def forwards(self, orm):
    db.rename_table('common_cat', 'specific_cat') 

    if not db.dry_run:
        # For permissions to work properly after migrating
        orm['contenttypes.contenttype'].objects.filter(
            app_label='common',
            model='cat',
        ).update(app_label='specific')

def backwards(self, orm):
    db.rename_table('specific_cat', 'common_cat')

    if not db.dry_run:
        # For permissions to work properly after migrating
        orm['contenttypes.contenttype'].objects.filter(
            app_label='specific',
            model='cat',
        ).update(app_label='common')


#0003_drop_cat:replace existing forward and backward code
#to use just one sentence; add dependency:

depends_on = (
    ('specific', '0003_create_cat'),
)
def forwards(self, orm):
    pass
def backwards(self, orm):
    pass

これで両方のアプリのマイグレーションが変更を認識し、人生の苦しみが少し軽減されました :-) このようにマイグレーション間の関係を設定することが成功の鍵です。 今、あなたがそうするなら。

python manage.py migrate common
 > specific: 0003_create_cat
 > common: 0003_drop_cat

は両方のマイグレーションを行い

python manage.py migrate specific 0002_create_dog
 < common: 0003_drop_cat
 < specific: 0003_create_cat

は下へ下へと移行します。

スキーマのアップグレードには共通アプリを使い、ダウングレードには特定アプリを使ったことに注意してください。これは、ここでの依存関係がどのように機能するかによるものです。