Django和猴子修补问题

时间:2009-09-09 13:40:40

标签: python django monkeypatching

我最近在业余时间开始尝试使用Django来处理一些Web应用程序。在设计数据模型时,我遇到了使用继承定义网站用户或使用已经由框架提供的User类进行猴子修补的技术的困境。

我尝试通过(在根据python manage.py validate定义了所有模型等而没有错误之后)添加字段:

User.add_to_class('location', models.CharField(max_length=250,blank=True))

并执行syncdb命令。但是,我一直收到此错误

  

OperationalError:没有这样的列:   auth_user.location

我是在网站的admin视图还是manage.py shell中。必须有一个我缺少的额外步骤,但似乎有关整个猴子修补技术的文档有限。所以,在我诉诸继承之前,我会请求你的帮助。当然欢迎任何代码,提示或指向其他文档的指示。

提前致谢。

PS。我知道这种技术很难看,而且可能是不明智的。 ;)

5 个答案:

答案 0 :(得分:13)

这两种方法都有替代方法,即只使用a related profile model。这也恰好是一个记录良好,强烈推荐的方法。正如你所指出的那样,add_to_class方法没有详细记录的原因可能是因为它是explicitly discouraged(有充分理由)。

答案 1 :(得分:7)

当您向任何模型添加字段时,即使您以“官方”方式执行此操作,您也需要迁移数据库 - Django不会为您执行此操作。放下桌子并再次运行./manage.py syncdb

您可能希望调查其中一个迁移框架,例如south,它将为您管理此类事情。

答案 2 :(得分:2)

答案 3 :(得分:0)

Djangos框架使用元类来初始化表。这意味着你不能在新列中进行猴子补丁,除非你也重新初始化了这个类,我甚至不确定它是否可行。 (可能是)。

有关详情,请参阅Difference between returning modified class and using type()

答案 4 :(得分:0)

我猜你可能会遇到关于你的monkeypatch定义在哪里的问题。我想django syncdb只能从“纯”的auth应用程序创建数据库表,所以你的模型将没有“位置”,然后你的网站将找到该字段。

in Django docs

描述了向用户个人资料添加其他信息可能不那么痛苦的方法