我有一个现有的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."
我是否需要每次为此特定应用假冒迁移?有人遇到过这个错误吗?
答案 0 :(得分:0)
为什么users.User是代理模型?我想,你必须在克隆的存储库中只使用不带syncdb的south。
答案 1 :(得分:0)
这是因为South(在当前版本0.8.4中)无法为代理模型的ManyToMany关系创建正确的迁移。 There is a open ticket for this issue。虽然你可以使用与通过类的ManyToMany关系来解决它。
答案 2 :(得分:0)
因为它仍然是一个开放的问题(在我们的编码器生活中的南方存储库:)),这是我通常的解决方法:
django-admin.py syncdb --all
django-admin.py migrate --fake
(前)
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时,它会对原始模型进行处理。