2009-09-09 63 views
4

我最近开始在业余时间用Django试验一些Web应用程序。在为数据模型设计数据模型时,我遇到了使用继承来定义网站用户或者使用已经由框架提供的用户类称为猴子补丁的技术的两难困境。Django和猴子补丁问题

我试图借助于增加一个字段(具有限定的我的所有型号等没有错误之后,根据python manage.py validate):

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

和执行的syncdb命令。但是,我不断收到此错误

OperationalError: no such column: auth_user.location

无论我在网站的管理视图还是manage.py shell。必须有一个额外的步骤,我错过了,但似乎整个猴子修补技术有限的文件。所以我在求助于继承之前请求你的帮助。任何代码,提示或指向其他文档的指针当然都是受欢迎的。

在此先感谢。

PS。我知道这种技术很丑陋,可能不太合适。 ;)

回答

7

当你添加一个字段到任何模型时,即使你以'官方'的方式,你需要迁移数据库 - Django不会为你做。放下桌子并再次运行./manage.py syncdb

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

+0

这一个伎俩!尽管sqlall命令没有显示任何与User类相关的SQL。谢谢! – 2009-09-09 14:11:03

0

Djangos框架使用元类来初始化表。这意味着你不能在新的专栏中进行猴子补丁,除非你还重新初始化课程,我不确定这是甚么可能的。 (可能是)。

请参阅Difference between returning modified class and using type()了解更多信息。

+0

当创建模型类时,Django确实会做各种类型的元类别技巧,但调用add_to_class方法(如OP所做的)恰恰是后来动态添加新字段的正确方法(它执行必要的技巧)。简单地将该字段作为类属性(不调用add_to_class)将不起作用。这里的问题与元类无关,与Django缺乏内置数据库模式迁移有关。 – 2009-09-09 15:29:00

+0

啊。当他实际上没有做任何事情时,我被他提到猴子补丁所欺骗了。 – 2009-09-09 15:53:10

0

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

向用户配置文件添加其他信息的可能较不痛苦的方式描述为in Django docs

13

这两种方法都有一种替代方法,那就是简单地使用a related profile model。这也恰好是一个有据可查的强烈推荐的方法。正如你所指出的,也许add_to_class方法没有很好记录的原因是因为它是explicitly discouraged(出于很好的理由)。

+0

相关的配置文件似乎是这方面的流行方式。引用用户字段的编码风格虽然有点丑陋,而且对我来说有点不直观。我一定会探讨这一点。 – 2009-09-09 14:12:21

+0

+1:只需使用该配置文件,它的工作原理非常奇妙。 – 2009-09-09 14:37:58

+0

这是在django.contrib.auth系统中扩展用户系统的推荐方式。如果您需要长期维护此系统,使用配置文件将为您提供对框架本身进行干净升级的最佳机会。 – wlashell 2009-09-09 18:39:02