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

int*_*tar 1 python django monkeypatching django-models

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

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

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

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

class OurUser(User) :
    objects = UserManager()
    class Meta:
        db_table = u'our_user_table'
Run Code Online (Sandbox Code Playgroud)

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

但是,这会失败(可能是因为ORM假设our_user_table应该有一个外键引用回原始用户表,而不是这样).

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

更新:

我想我可以通过在local_settings.py中"修补"用户的_meta来进行我想要的更改.

User._meta.db_table = 'our_user_table'
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*eys 6

您可能会发现将旧表设置为备用身份验证源并避开所有这些问题很有用.

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

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

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

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