web-dev-qa-db-ja.com

Django 1.7-管理されていないモデルの移行を作成するmakemigrations

私はアプリケーションでいくつかの動的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の移行システムにアンマネージモデルをすべて一緒に無視するように指示する方法はありますか?またはおそらくMetaクラスのmigrations = False設定モデルの?

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

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

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

22
chadgh

簡単に言うと、Djangoはこのために構築されていません。モデルを「管理されていない」 にすることは、Djangoが作成されない、またはそのためのテーブルを削除します-他には何もありません

ただし、同じアプリ内にこれらの動的モデルと一緒に通常のモデルがない場合は、条件付きでアプリをINSTALLED_APPSsettings.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フレームワーク

5
Daniel Hawkins

生成されたmigrations.CreateModel操作を、常に実際のモデルの状態を反映する独自の操作に置き換えることをお勧めします。このようにして、状態の変化が検出されることはありません。

class CreateDynamicModel(CreateModel):
    def __init__(self):
        # ... dynamically generate the name, fields, options and bases
        super(CreateDynamicModel, self).super(
            name=name, fields=fields, options=optins, bases=bases
        )
2
Simon Charette

おそらく、動的モデルに対してFalseを返す allow_migrate メソッドを使用してカスタムデータベースルーターを作成できます。その場合、migrateコマンドはそれらを許可しません。

これらの動的モデルをmodels.pyモジュールにロードしない限り、makemigrationsもそれらを取得しないはずです。

1
meshantz