1. ホーム
  2. python

[解決済み] 2つのDjangoアプリ間でモデルを移動させる方法 (Django 1.7)

2022-05-11 21:41:01

質問

しかし、Django を使い始めてから、私のプロジェクトレイアウト、主にモデルの構造がひどいと思うようになりました。

私は主に1つのアプリにモデルを保持しており、本当はこれらのモデルのほとんどは、それぞれ個別のアプリにあるべきものです。私はこれを解決し、南でそれらを移動しようとしましたが、私はそれがトリッキーで外部キーなどのために本当に難しいことがわかりました。

しかし、Django 1.7ではマイグレーションがサポートされるようになったので、これを行う良い方法があるのでしょうか?

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

データ消失の恐れがあるため、古い回答は削除しています。というのも ozanさんがおっしゃるには 2つのマイグレーションをそれぞれのアプリで作成することができます。この記事の下のコメントは、私の古い答えを参照してください。

1つ目のマイグレーションで、1つ目のアプリからモデルを削除します。

$ python manage.py makemigrations old_app --empty

これらの操作を含むようにマイグレーションファイルを編集します。

class Migration(migrations.Migration):

    database_operations = [migrations.AlterModelTable('TheModel', 'newapp_themodel')]

    state_operations = [migrations.DeleteModel('TheModel')]

    operations = [
      migrations.SeparateDatabaseAndState(
        database_operations=database_operations,
        state_operations=state_operations)
    ]

2回目のマイグレーションは、1回目のマイグレーションに依存し、2番目のアプリに新しいテーブルを作成します。モデルコードを2番目のアプリに移動した後

$ python manage.py makemigrations new_app 

で、migration ファイルを以下のように編集します。

class Migration(migrations.Migration):

    dependencies = [
        ('old_app', 'above_migration')
    ]

    state_operations = [
        migrations.CreateModel(
            name='TheModel',
            fields=[
                ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
            ],
            options={
                'db_table': 'newapp_themodel',
            },
            bases=(models.Model,),
        )
    ]

    operations = [
        migrations.SeparateDatabaseAndState(state_operations=state_operations)
    ]