4

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

我试图通过(在没有错误地定义我的所有模型等之后,根据python manage.py validate)添加一个字段:

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

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

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

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

提前致谢。

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

4

5 回答 5

13

这两种方法都有一个替代方案,即简单地使用相关的配置文件模型。这也恰好是一个有据可查、强烈推荐的方法。正如您所指出的,可能 add_to_class 方法没有充分记录的原因是因为它被明确禁止(有充分的理由)。

于 2009-09-09T13:55:48.210 回答
7

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

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

于 2009-09-09T13:52:26.647 回答
2

这是扩展User模型的(稍旧的)方式。

是文档必须说的

这是最近关于 django-users关于该主题的对话。

于 2009-09-09T13:48:40.160 回答
0

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

有关更多信息,请参阅返回修改后的类和使用 type() 之间的区别

于 2009-09-09T13:46:48.847 回答
0

我猜你可能会遇到关于你的猴子补丁在哪里定义的问题。我猜 django syncdb 仅从“纯”身份验证应用程序创建数据库表,因此您的模型将没有“位置”,然后您的带有补丁的站点将查找该字段。

Django docs中描述了向用户配置文件添加附加信息的方式可能不那么痛苦。

于 2009-09-09T13:47:22.983 回答