模型语法变更

作者:Adrian Holovaty 发布于 2005年8月25日

应大家的要求,我即将更改 Django 的模型语法,使用 "fieldname = FieldClass" 代替 "FieldClass('fieldname')"。这已经是一个长期存在的工单了。

此更改与之前版本不兼容,所以在更改您的模型之前,请不要 "svn update" 您的代码。旧的模型语法将无法工作。

对于这种与之前版本不兼容的情况,我深表歉意,但这仍然是非官方软件。 ;-) 一旦我们达到 1.0 版本——现在模型语法已经更改,这离我们更近了——我们将非常注重向后兼容性。

在 1.0 版本之前,我想不出我们还有什么其他的与之前版本不兼容的更改计划(敲木头)。如果这不是最后一个,那它至少是最后一个主要的更改。

这是一个新的语法的快速示例

class Foo(meta.Model):
    first_name = meta.CharField("The person's first name", maxlength=30)
    last_name = meta.CharField(maxlength=30)
    bar = meta.ForeignKey(Bar)
    sites = meta.ManyToManyField(Sites)
    class META:
        ordering = ('-bar',)
        admin = meta.Admin(
            fields = (
                (None, {'fields': ('first_name', 'last_name', 'bar', 'sites')}),
            ),
        )

    def __repr__(self):
        return self.first_name

请注意,所有非字段元数据都放在名为 "META" 的内部类中。

另请注意,ForeignKey、ManyToManyField 和 OneToOneField 现在需要显式名称(在示例中,即 "bar" 和 "sites")。之前,FK/MTM/OTO 字段的字段名称是可选的(作为快捷方式),这给人们带来了困惑——他们不知道如何在 "admin.fields" 中引用字段。现在它很明确了。

此更改应该非常稳定。在过去两天里,我一直将其在 World Online 的生产环境中进行测试。因此,我能够在问题出现时及时解决。此外,我还更新了每一个模型单元测试(以及模型示例),以使用新的语法,并且所有测试都通过了。

以下是更改模型所需了解的内容

如果您有任何问题,请发送邮件到django-users 邮件列表访问 IRC

我已经浏览了文档并尝试使用新语法进行更新。但我肯定错过了一些东西。如果您愿意,请查看一下我们的文档,如果您发现任何错误,请通过提交工单告知我们。

最后,我想公开感谢 mmarshall、rmunn、garthk、hugo、manuzhai 和所有其他为这次更改贡献补丁、想法和热情讨论的优秀人士。这是 Django 的第一个真正意义上的社区驱动型改进,看到它最终实现真是太棒了。谢谢你们!

返回顶部