为啥 Django South 1.0 使用 iteritems()?

Posted

技术标签:

【中文标题】为啥 Django South 1.0 使用 iteritems()?【英文标题】:Why does Django South 1.0 use iteritems()?为什么 Django South 1.0 使用 iteritems()? 【发布时间】:2014-08-23 03:44:20 【问题描述】:

我刚刚安装了 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'

我已通过用 items() 替换两次出现的 iteritems() 来修复它。 我的问题是:

如果 South 1.0 与 Python3 兼容,为什么会出现这种情况? 我的修复会给我带来什么麻烦吗?

我很惊讶我找不到任何遇到同样问题的人。

【问题讨论】:

【参考方案1】:

更新:South 1.0.1 于 2014 年 10 月 27 日发布,includes the fix for this issue:

南 1.0.1

这是 South 的一个小错误修正版本,有两个变化:

Python 3 兼容性已修复(在 1.0 中因意外引入 iteritems() 而被破坏) 如果 South 检测到 Django 1.7 或更高版本,而不是因神秘错误而失败,它将显式出错。

下面是我的原始答案


似乎 Django-South 并不真正支持 Python 3,至少该项目在发布之前没有验证支持。见this issue in the South tracker:

Python3 支持有什么进展吗?目前状态如何?

在0.8.3版本之前看到一个python3相关的commit,想知道是否完整。


它应该可以工作,但如果你想要持续的 Python 3 支持,那么你最好使用 django 1.7 的迁移,它是 South 的继任者,并且拥有完整的 python 3 测试套件。

显然,“排序”是“不是真的”;维护者已将重点转移到 Django 1.7 的新迁移基础架构上。

0.8.4 兼容的,但是this commit再次破坏了兼容性;您的更改应该足以解决该问题。有一个 pull request 解决了这个问题,但尚未合并。

由于 1.0 是昨天才发布的,所以你还没有发现其他人有这个问题的原因是因为还没有多少人遇到它。

Django 1.7 的迁移支持基本上将 South 集成到主线中,并且它完全支持 Python 3(为捕获此类回归的完整 Django 树运行自动测试)。第一个候选版本已经发布(有关如何安装它的说明,请参阅https://www.djangoproject.com/download/)。

【讨论】:

哇,很好的答案,非常感谢。没想到昨天South 1.0已经发布了! (哈哈)。很高兴看到我们将数据库迁移支持集成到 Django 中,是时候了 =)。 这令人沮丧。我预计南方的开发者会在他们的游戏中处于领先地位。使用python3.2 运行单元测试有多难?无论如何,如果它不支持 Python3,他们不应该宣传它支持 Python3... 同时,使用pip install https://bitbucket.org/andrewgodwin/south/get/e2c9102ee033.zip#egg=South 安装South 以获得工作版本。 @DanielJonsson:发布了,终于

以上是关于为啥 Django South 1.0 使用 iteritems()?的主要内容,如果未能解决你的问题,请参考以下文章

不知道为啥 django South 试图运行反向迁移

使用 Django/South 重命名模型的最简单方法?

目前使用 Django “Evolution”,“South”是不是更好,值得切换?

Django 迁移——是不是可以在项目中间使用 South?

无法在 Django 1.7 中创建 South 数据库模型

如何使用 django-south 恢复删除的表?