1

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

看起来可以在用户定义的 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 应用程序的上下文中?)

4

1 回答 1

6

您可能会发现将旧表设置为替代身份验证源并回避所有这些问题很有用。

另一种选择是将用户子类化并让子类指向您的用户模型。覆盖保存功能以确保保留旧功能所需的一切都在那里。

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

更新 在这种情况下,我所说的替代身份验证的意思是一个小的 python 脚本,上面写着“是的,这是一个有效的用户名/密码”——然后它在标准 Django 表中创建一个模型实例,从遗留表复制字段和将新用户返回给调用者。

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

于 2009-05-14T23:50:16.950 回答