为什么Django South 1.0使用iteritems()?
我刚安装了South 1.0,当我准备进行第一次迁移时,出现了这个错误信息:
... /lib/python3.4/site-packages/south/migration/migrators.py", line 186, in _run_migration
for name, db in south.db.dbs.iteritems():
AttributeError: 'dict' object has no attribute 'iteritems'
我通过把两处iteritems()替换成items()解决了这个问题。
我有几个问题:
- 如果South 1.0和Python3是兼容的,为什么会出现这个问题呢?
- 我这个修复会不会带来其他麻烦?
我很惊讶居然找不到其他人遇到同样的问题。
1 个回答
23
更新: South 1.0.1版本于2014年10月27日发布,这个版本修复了这个问题:
South 1.0.1
这是South的一个小bug修复版本,包含两个改动:
- 修复了与Python 3的兼容性(在1.0版本中,由于意外引入了
iteritems()
,导致兼容性出现问题)- 如果检测到Django 1.7或更高版本,South会明确报错,而不是出现一些难以理解的错误信息。
我原来的回答如下。
看起来Django-South并不真正支持Python 3,至少在发布之前项目并没有验证支持情况。请查看South跟踪器中的这个问题:
关于Python 3的支持有没有进展?目前的状态是什么?
我看到在0.8.3版本发布之前有一个与python3相关的提交,不知道这个支持是否完成。
它应该可以部分工作,但如果你想要持续的Python 3支持,使用Django 1.7的迁移功能会更好,因为它是South的继任者,并且有完整的Python 3测试套件。
显然,“部分”就是“不太行”;维护者已经将重点转向Django 1.7的新迁移框架。
0.8.4 曾经是兼容的,但这个提交又破坏了兼容性;你的修改应该能解决这个问题。还有一个拉取请求专门解决这个问题,但还没有合并。
由于1.0版本昨天才发布,所以你没有找到其他人遇到这个问题的原因是因为还没有很多人碰到它。
Django 1.7的迁移支持基本上是将South整合进主线,并且完全支持Python 3(会对整个Django树进行自动化测试,以捕捉像这样的回归问题)。第一个候选版本已经发布(请查看https://www.djangoproject.com/download/获取安装说明)。