張高モデルを別のアプリケーションに移行しましょう.

18401 ワード

リリー・プマンシステムの拡張に伴い、新しいテーブルとアプリケーションが必要です.
既存のアプリケーションを迅速に開発するために、この機会を利用して1つのアプリケーションを別のアプリケーションに集中しましょう.
考えているだけで目がくらくらしますが、幸いなことに倉庫にはこの過程を助ける機能がたくさんあります.
  • 方向性:既存のテーブルに新しいモデルを参照させます.新しいモデルを作成すると、AlterModelTableという名前の移行オプションを使用して、既存のテーブルの名前を新しいモデルに変更できます.この場合、新しいモデルを使用して新しいテーブルは作成されません.
  • 1.新しいモデルを作る
  • アプリケーションから移行するモデルを削除し、新しいアプリケーションに新しいモデルを作成します.外部キー関係も変更に応じて変更されます.
  • classes: Matching, Presession, SessionBatch, Session
  • core: Region
  • personnels: Staff, Counselor, counselor_available_region
  • services: Application
  • 移行ファイルを作成します.各モデルの名前を決定します.私の場合、db tableをmetaに設定するので、metaを参照できます.
  • 2.既存テーブルの名前の変更
  • の既存のアプリケーションでテーブルが削除されたため、移行ファイルには外部キー関係を削除するremovefield、モデルを削除するdeletemodel、新しいモデルを作成するCreate model、新しい外部キーを生成するalterfieldの4つの操作があります.
  • は4つのオファーを修正する必要があります.従業員アプリケーションからモデルを削除および移動しているため、removefield、deletemodel、alterfieldは従業員の移行ファイルにあり、残りのアプリケーションではalterfieldおよびcreatemodelがほとんどです.
  • removefield:
  • Using SeparateDatabaseAndState with database_operations set to an empty list prevents Django from dropping the column.
  • operations = [
    -        migrations.RemoveField(
    -            model_name='product',
    -            name='category',
    +        migrations.SeparateDatabaseAndState(
    +            state_operations=[
    +                migrations.RemoveField(
    +                    model_name='product',
    +                    name='category',
    +                ),
    +            ],
    +            database_operations=[],
                       ),
                   ]
    deletemodel:
  • Django provides a special migration operation, AlterModelTable, to rename a table for a model. Edit the migration that drops the old table, and instead rename the table to the name of the new table
  • operations = [
    -        migrations.DeleteModel(
    -            name='Product',
    -        ),
    +        migrations.SeparateDatabaseAndState(
    +            state_operations=[
    +                migrations.DeleteModel(
    +                    name='Product',
    +                ),
    +            ],
    +            database_operations=[
    +                migrations.AlterModelTable(
    +                    name='Product',
    +                    table='product_product',
    +                ),
    +            ],
    +        )
         ]
    createmodel
  • Next, you need to prevent Django from creating a table for the new Product model. Instead, you want it to use the table you renamed. Due to the line database_operations=[] , Django does not create the table.
  • operations = [
    -        migrations.CreateModel(
    -            name='Product',
    -            fields=[
    -                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
    -                ('name', models.CharField(db_index=True, max_length=100)),
    -                ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='catalog.Category')),
    -            ],
    +        migrations.SeparateDatabaseAndState(
    +            state_operations=[
    +                migrations.CreateModel(
    +                    name='Product',
    +                    fields=[
    +                        ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
    +                        ('name', models.CharField(db_index=True, max_length=100)),
    +                        ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='catalog.Category')),
    +                    ],
    +                ),
    +            ],
    +            # Table already exists. See catalog/migrations/0003_delete_product.py
    +            database_operations=[],
             ),
         ]
    alterfield
    operations = [
    -        migrations.AlterField(
    -            model_name='sale',
    -            name='product',
    -            field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='product.Product'),
    -        ),
    +        migrations.SeparateDatabaseAndState(
    +            state_operations=[
    +                migrations.AlterField(
    +                    model_name='sale',
    +                    name='product',
    +                    field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='product.Product'),
    +                ),
    +            ],
    +            # You're reusing an existing table, so do nothing
    +            database_operations=[],
    +        )
         ]
  • 注意:コードをマシンに置かないで、生成する必要がある新しいモデルも別々に処理して、ブーブー.
  • 新しく作成されたフィールドまたはモデル一緒に作ると絡み合います
  • 3.移行
  • 私はずっとこのような間違いをしています.
  • リレーションシップは既に存在します.これは、名前を持つテーブルがすでに存在することを意味します.したがって、データベースを表示すると、テーブルが生成されたことがわかります.問題は、この問題がタイムリーに発見されず、ロールバックと移行を繰り返したときにテーブルが作成されたことです.まず、データベース内の問題テーブルをバッチで削除し、移行を再開します.正常に動作します.
  • 今回は関係ありません.この場合、テーブルは偽物ですが、他のアプリケーションのモデル名をstaffle staffsからstaffle staffsに変更する必要がありますが、この部分はできません.この移行ファイルのみを移行します.
  • が現れたら、簡単に解決できます.対応する移行ファイルのコメントに新しい関係を定義する部分.このような状況が発生したのは、既存のテーブルにすでに関係があり、テーブル名を変更する過程で、新しく作成された障害と考えられるテーブルと新しい関係を確立しようとしたためです.
  • まず、私が最も間違っている部分は、新しく作成したテーブルを別々に作業していないこと、新しく作成したテーブルの参照関係を個別に整理して移行していないことです.次は混同しないでください.
  • Introspection
  • 枚のGOORMは、Pythonで作成したテーブルの内容をデータベーステーブルに翻訳し、プライマリ・キーや自動インクリメント・シーケンスなどを生成します.生成された変数には、テーブルの名前+特定の名前形式の名前があります.この場合、このロケーションで行ったようにテーブルの名前を変更すると、これらの変数の名前も変更されますか?答えは変わらない.しかし、それでも張高は関係性を見つけることができる.この文書では、データベースが提供するメタデータ・テーブルを使用して、内省と呼ばれる関係性を検索します.すなわち,ネーミング規則に依存することなくオブジェクトを処理できる.
  • ソース:How to Move a Django Model to ANother App