在Django中,如何更改用户类以使用不同的数据库表?

1 投票
1 回答
2036 浏览
提问于 2025-04-15 11:36

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

看起来可以通过在用户定义的 Meta 类中更改表名来实现这一点。

但我们更希望不去改动 Django 的核心部分。

所以我们在考虑可以像这样对核心的 auth.User 类进行子类化:

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

这里的目的是不想在自定义的用户类中添加额外的字段,而只是想使用另一个表。

然而,这样做失败了(可能是因为 ORM 假设我们的用户表应该有一个外键指向原来的用户表,但实际上并没有)。

那么,这样做是否合理呢?我是不是漏掉了更简单的方式来将类映射到表?如果没有的话,这样能否实现?

更新:

我觉得我可能只需在 local_settings.py 中“猴子补丁”一下 User 的 _meta,就能实现我想要的更改。

User._meta.db_table = 'our_user_table'

有没有人想到这样做可能会有什么坏处?(特别是在一个比较典型的 Django / Pinax 应用程序的上下文中?)

1 个回答

6

你可以考虑把旧的表格设置成一个备用认证来源,这样就能避开很多麻烦。

另外一个选择是创建一个用户的子类,让这个子类指向你的用户模型。你可以重写保存功能,确保保留你需要的旧功能。

我自己没有尝试过这两种方法,但希望这些建议对你有帮助。

更新
我所说的备用认证,指的是一个简单的Python脚本,它会检查“这个用户名/密码是有效的”。然后它会在标准的Django表格中创建一个模型实例,把旧表格中的字段复制过来,并把新用户返回给调用者。

如果你需要保持这两个表格的数据同步,你可以选择让备用认证不创建标准的Django用户,只是简单地确认“这个密码和用户名是有效的”。

撰写回答