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

Max*_* R. 15 python django proxy-classes django-migrations

我刚刚创建了一个代理模型,并且惊讶于manage.py makemigrations创建了一个带有migrations.CreateModel操作的新迁移文件.

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

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

它是否用于触发代理模型权限的创建?代理模型权限有一个6岁的开放式bug,所以我不确定这个部分应该如何工作...

它用来Django 1.8测试这个.

编辑:澄清一下,Django创建一个对新代理模型没有任何作用的迁移,所以Django如果它没有用,我们不想在第一时间创建迁移吗?

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

e4c*_*4c5 22

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

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

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

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

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

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


cla*_*ond 6

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

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

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