23

アプリケーションでいくつかの動的 Django モデルを作成していますが、移行システムを除いてすべてが期待どおりに機能しているようです。

動的 Django モデルを作成して managed = False に設定すると、Django のmakemigrationsコマンドは引き続きその新しいモデルの移行を生成します。移行は次のようになります。

class Migration(migrations.Migration):

    dependencies = [
        ('atom', '0001_initial'),
    ]

    operations = [
        migrations.CreateModel(
            name='books',
            fields=[
            ],
            options={
                'db_table': 'books',
                'managed': False,
            },
            bases=(models.Model,),
        ),
    ]

移行を作成しない場合、 を実行するpython manage.py migrateと、次のメッセージが表示されます (大きな恐ろしい赤い文字で)。

Your models have changes that are not yet reflected in a migration, and so won't be applied.
Run 'manage.py makemigrations' to make new migrations, and then re-run 'manage.py migrate' to apply them.

Django 1.7 の移行システムに、管理されていないモデルをすべて無視するように指示する方法はありますか? それともmigrations = False、モデルの Meta クラスの設定でしょうか?

更新:明確にするために、次の場所で説明されているものと同様の動的モデルを作成する方法を使用しています。

この方法は、構成モデル ( https://code.djangoproject.com/wiki/DynamicModels#Adatabase-drivenapproach )に格納されている情報に基づいて動的モデルを生成するのに最適です。構成インスタンスが変更されたときにモデルへの変更をキャッチするために、django モデル キャッシュをクリアするシグナルを登録する必要がありましたが、これらのモデルの移行が生成されるという事実を除いて、すべてがうまく機能しているようです。構成の 1 つを削除し、モデルが Django のキャッシュから削除された場合、移行を再度更新して、気にする必要のないモデルを削除する必要があります。

これらの動的モデルは、アプリケーションでは特に使用されません。コードのどこで book モデルを参照していませんか (上記の例から)。それらは実行時に生成され、アクセスを提供する従来のテーブルから情報を読み取るために使用されます。

4

3 に答える 3

5

簡単に言えば、Django はこのために構築されていないということです。モデルを「管理対象外」にすることは、Django がそのモデルのテーブルを作成または削除しないことを意味するだけです

つまり、同じアプリ内にこれらの動的モデルと一緒に通常のモデルがない場合は、条件付きでアプリをINSTALLED_APPSin に追加できsettings.pyます。

if not ('makemigrations' in sys.argv or 'migrate' in sys.argv):
    INSTALLED_APPS += (
        'app_with_dynamic_models',
        'another_app_with_dynamic_models',
    )

これにより、移行の作成および実行時に Django がアプリを無視するようになります。ただし、移行を使用しないアプリを持つ機能は Django 1.9 で廃止される予定であるため、モデルを使用する場合は、最終的にモデルの移行を作成して実行する必要があります。contenttypes フレームワークを使用するように動的モデルをリファクタリングできますか?

于 2014-11-06T21:26:37.553 に答える