在Django中,如何更改User类以使用不同的db表?

时间:2009-05-14 23:41:47

标签: python django django-models monkeypatching

我们正在运行django并与现有应用程序共享数据库。我们希望使用现有的“用户”表(不是Django自己的)来存储用户信息。

看起来可以在User定义的Meta类中更改Django使用的表的名称。

但我们宁愿不改变Django核心本身。

所以我们认为我们可以像这样对核心auth.User类进行子类化:

class OurUser(User) :
    objects = UserManager()
    class Meta:
        db_table = u'our_user_table'

这里,目的不是为自定义的User类添加任何额外的字段。但只是使用替代表。

然而,这失败了(可能是因为ORM假设our_user_table应该有一个外键引用回原来的User表,而不是)。

那么,这种明智的做法是做我们想做的事吗?我是否错过了将类映射到表格的简单方法?或者,如果没有,这可以起作用吗?

更新:

我想我可以通过在local_settings.py

中“修补”用户的_meta来进行我想要的更改
User._meta.db_table = 'our_user_table'

如果我这样做,有人会想到可能发生的任何坏事吗? (特别是在相当典型的Django / Pinax应用程序的上下文中?)

1 个答案:

答案 0 :(得分:6)

您可能会发现将旧表设置为alternative authentication source并回避所有这些问题很有用。

另一个选项是subclass the user并让子类指向您的用户模型。覆盖保存功能以确保您需要执行的所有操作以保留旧功能。

我自己没有做过这些,但希望它们是有用的指针。

<强>更新 我在这种情况下的替代身份验证的意思是一个小的python脚本,上面写着“是的,这是一个有效的用户名/密码” - 然后它在标准Django表中创建一个模型实例,复制旧表中的字段并返回呼叫者的新用户。

如果您需要保持两个表同步,您可以决定让您的备用身份验证永远不会创建标准的django用户,只需说“是的,这是一个有效的密码和用户名”