为什么Django会为代理模型创建迁移文件?

时间:2016-06-23 10:23:26

标签: python django django-migrations proxy-classes

我刚刚创建了一个proxy model,我很惊讶manage.py makemigrations创建了一个migrations.CreateModel操作的新迁移文件。

代理模型不会创建新的数据库表,它只是同一数据集的不同python接口,实际上manage.py sqlmigrate my_app_label 0042不返回任何内容。

我认为它可能会用于创建代理模型ContentType,但如果它们不存在则按需创建。

是否用于触发代理模型权限的创建?代理模型权限有6 year old open bug,所以我不确定这部分应该如何工作......

它使用Django 1.8来测试它。

修改:为了澄清,Django创建的迁移对新的代理模型没有任何作用,因此我们不希望Django不在如果它没有用,那么第一名?

是否存在迁移有用的用例?

2 个答案:

答案 0 :(得分:17)

啊,但是如果你在编辑器中打开迁移,你会发现它实际上是一个空的迁移!这是一个例子

class Migration(migrations.Migration):
    dependencies = [
        ('stackoverflow', '0009_auto_20160622_1507'),
    ]

    operations = [
        migrations.CreateModel(
            name='MyArticle',
            fields=[
            ],
            options={
                'proxy': True,
            },
            bases=('stackoverflow.article',),
        ),
    ]

如果你运行./manage.py sqlmigrate myapp 0010(这是与我上面的迁移相对应的数字),你得到的就是下一行的内容(没有)。

这是因为迁移的fields部分为空,option包含proxy = True。此设置可防止为此迁移执行任何SQL,并保持原始表不受影响。

所以你可能会问,Django为什么要创建一个空的迁移呢?这是因为在将来的迁移中,代理模型可能会被另一个模型引用。

答案 1 :(得分:3)

我相信migrations是生成的,因为数据库受到影响,而migrations是Django发出数据库更改信号的方式。结构不会更改,但会在(至少)两个表中添加条目:

  • 代理模型的ContentType添加了新的django_content_type
  • 特定于代理模型的权限将添加到auth_permission。我假设这种“总是”发生,除非代理使用完全相同的类名。它肯定会发生 - 我们实际上使用代理模型来访问使用不同权限的用户而不触及默认的用户模型。

这两个细节实际上都是在OP链接的问题的评论链中注明的(例如评论#31),因为它们会导致错误(即Django在不同的应用程序中查找权限,而不是{ {1}})。