0

我有一个现有的 Django 模型,它引用代理模型 users.User 作为 ManyToMany 字段。我最近为模型创建了一个初始的南迁移,并使用 --fake 标志毫无问题地应用它。

现在,如果我重新克隆我的存储库,运行 syncdb,然后尝试应用我的迁移,当它使用 ManyToMany 字段处理模型时,我会收到这个 South 错误:

Running migrations for <app>:
 - Migrating forwards to 0001_initial.
 > <app>:0001_initial
Traceback (most recent call last):
  File "manage.py", line 14, in <module>
    execute_manager(settings)
... (traceback)
raise KeyError("The model '%s' from the app '%s' is not available in this migration." %    (model, app))
KeyError: "The model 'user' from the app 'users' is not available in this migration."

对于这个特定的应用程序,我是否需要每次都伪造迁移?有人有这个错误的经验吗?

4

3 回答 3

0

为什么 users.User 是代理模型?我认为,您必须在克隆存储库中仅使用不带 syncdb 的南。

于 2012-07-10T18:39:34.437 回答
0

这是因为 South(在当前版本 0.8.4 中)无法为与代理模型的多对多关系创建正确的迁移。这个问题有一张公开的票。尽管您可以使用具有直通类的 ManyToMany 关系来解决它。

于 2013-11-30T20:55:07.430 回答
0

因为它仍然是一个未解决的问题(在 South 存储库中,就像在我们的程序员生活中一样 :)),这是我通常的解决方法:

1. 新装置

django-admin.py syncdb --all
django-admin.py migrate --fake

2. 修复迁移(手动)

(前)

    db.create_table(m2m_table_name, (
        ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
        ('message', models.ForeignKey(orm[u'email.message'], null=False)),
        ('avcpuser', models.ForeignKey(orm[u'profiles.avcpuser'], null=False)) # this is the troublesome proxy model (profiles.avcpuser is my proxy towards auth.User
    ))

(后)

    db.create_table(m2m_table_name, (
        ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
        ('message', models.ForeignKey(orm[u'email.message'], null=False)),
        ('avcpuser', models.ForeignKey(orm[u'auth.User'], null=False)) # replace it with a ForeignKey to the original model
    ))

老实说,我不是 100% 确定这个修复是“合法的”并且可以被列为“最佳实践”,但到目前为止,它并没有给我带来任何维护现有和新项目的问题。为了我的辩护,我想到了这个想法,注意到当 South 为代理模型生成一对多的 ForeignKey 时,它会针对原始模型执行此操作。

于 2015-06-12T13:08:45.420 回答