Skip to main content
 首页 » 编程设计

python之在 Django 中,如何更改 User 类以使用不同的数据库表

2025年05月04日33fff_TT

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

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

但我们不希望更改 Django 核心本身。

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

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

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

但是,这失败了(可能是因为 ORM 假设 our_user_table 应该有一个外键引用回原始用户表,但它没有)。

那么,这是做我们想做的事情的明智方法吗?我是否错过了将类映射到表的更简单方法?或者,如果不能,是否可以让它发挥作用?

更新:

我想我可以通过在 local_settings.py 中“猴子修补”用户的 _meta 来做出我想要的改变

User._meta.db_table = 'our_user_table' 

谁能想到如果我这样做会发生什么坏事? (特别是在相当典型的 Django/Pinax 应用程序的上下文中?)

请您参考如下方法:

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

另一种选择是 subclass the user并让子类指向您的用户模型。覆盖保存功能以确保您需要做的一切来保留您的旧功能。

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

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

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