South ManyToMany迁移

时间:2012-07-06 16:22:50

标签: django django-south

我有一个现有的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."

我是否需要每次为此特定应用假冒迁移?有人遇到过这个错误吗?

3 个答案:

答案 0 :(得分:0)

为什么users.User是代理模型?我想,你必须在克隆的存储库中只使用不带syncdb的south。

答案 1 :(得分:0)

这是因为South(在当前版本0.8.4中)无法为代理模型的ManyToMany关系创建正确的迁移。 There is a open ticket for this issue。虽然你可以使用与通过类的ManyToMany关系来解决它。

答案 2 :(得分:0)

因为它仍然是一个开放的问题(在我们的编码器生活中的南方存储库:)),这是我通常的解决方法:

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%确定此修复程序是&#34; lecit&#34;并且可以列入&#34;最佳实践&#34;,但到目前为止,它并没有给我带来任何维护现有项目和新项目的问题。为了我的辩护,我发现这个想法注意到,当South为代理模型生成1对多的ForeignKeys时,它会对原始模型进行处理。

相关问题