Django 1.7 - makemigrations为非托管模型创建迁移

cha*_*dgh 21 django django-models django-migrations

我在我的应用程序中创建了一些动态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,),
        ),
    ]
Run Code Online (Sandbox Code Playgroud)

如果我不创建迁移,当我运行时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.
Run Code Online (Sandbox Code Playgroud)

有没有办法告诉Django 1.7中的迁移系统一起忽略非托管模型?或者migrations = False模型的Meta类中的设置?

更新:为了澄清,我使用一种方法来创建我的动态模型,类似于以下地方描述的模型:

此方法非常适合根据存储在配置模型中的信息生成动态模型(https://code.djangoproject.com/wiki/DynamicModels#Adatabase-drivenapproach).我确实需要注册一个信号来清除django模型缓存,以便在更改Configuration实例时捕获对模型的更改,但除了为这些模型生成迁移之外,一切似乎都很好.如果我删除其中一个配置并从Django的缓存中删除模型,则需要再次更新迁移,删除它不应该关心的模型.

这些动态模型未在应用程序中专门使用.我没有在代码中的哪个地方引用书籍模型(来自上面的例子).它们在运行时生成,用于从它们提供访问的旧表中读取信息.

Dan*_*ins 5

简短的答案是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',
    )
Run Code Online (Sandbox Code Playgroud)

这应该使Django在创建和运行迁移时忽略该应用程序。但是,如果要使用模型,最终将不得不为模型进行迁移并运行,因为在Django 1.9中,具有不使用迁移功能的应用程序的能力将消失。您的动态模型可以重构为使用contenttypes框架吗?