热门标签:
Q:

Django1.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.

有没有办法告诉Django1.7中的迁移系统忽略所有非托管模型? 或者模型的元类中的migrations = False设置?

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

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

这些动态模型没有在应用程序中专门使用。 没有代码中的哪个地方我引用了一个books模型(来自上面的例子)。 它们是在运行时生成的,用于从它们提供访问权限的遗留表中读取信息。

原网址
A:

简短的回答是Django不是为此而构建的。 使你的模型"非托管"只意味着Django不会为它创建或删除表-没有别的

也就是说,如果您在同一个应用程序中没有常规模型和这些动态模型,则可以有条件地将应用程序添加到settings.py中的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在创建和运行迁移时忽略应用程序。 但是,如果你想使用它们,你最终将不得不为模型创建和运行迁移,因为拥有不使用迁移的应用程序的能力在Django1.9中消失。 您的动态模型是否可以重构为使用contenttypes框架

所有回答

共 2 条

author avatar

我建议您将生成的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
        )
author avatar

您可能可以使用allow_migrate方法为动态模型返回False编写自定义数据库路由器。 在这种情况下,migrate命令将禁止它们。

只要您不在任何models.py模块中加载这些动态模型,makemigrations也不应该拾取它们。

相似问题