Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在Django中,如何更改用户类以使用不同的db表?_Python_Django_Django Models_Monkeypatching - Fatal编程技术网

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

Python 在Django中,如何更改用户类以使用不同的db表?,python,django,django-models,monkeypatching,Python,Django,Django Models,Monkeypatching,我们正在与现有应用程序一起运行django,并与之共享一个数据库。我们希望使用现有的“用户”表(不是Django自己的)来存储用户信息 看起来可以在用户定义的元类中更改Django使用的表的名称 但我们不希望改变Django内核本身 所以我们认为我们可以将核心auth.User类分为以下子类: class OurUser(User) : objects = UserManager() class Meta: db_table = u'our_user_table'

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

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

但我们不希望改变Django内核本身

所以我们认为我们可以将核心auth.User类分为以下子类:

class OurUser(User) :
    objects = UserManager()
    class Meta:
        db_table = u'our_user_table'
在这里,目的不是向自定义用户类添加任何额外字段。但只是使用替代表

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

那么,这样做是否明智呢?我是否错过了一些将类映射到表上的简单方法?或者,如果没有,这能起作用吗

更新:

我想我可以通过在一个local_settings.py中“monkey patching”用户的meta来做出我想要的改变

User._meta.db_table = 'our_user_table'

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

您可能会发现,将旧表设置为一个工具并避开所有这些问题是很有用的

另一个选项是将子类指向您的用户模型。重写save函数,以确保保存旧功能所需的所有操作都在那里

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

更新 在本例中,我所说的替代身份验证是一个小python脚本,它说“是的,这是一个有效的用户名/密码”——然后它在标准Django表中创建一个model实例,复制遗留表中的字段,并将新用户返回给调用者


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

您可能会发现将旧表设置为一个表并回避所有这些问题很有用

另一个选项是将子类指向您的用户模型。重写save函数,以确保保存旧功能所需的所有操作都在那里

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

更新 在本例中,我所说的替代身份验证是一个小python脚本,它说“是的,这是一个有效的用户名/密码”——然后它在标准Django表中创建一个model实例,复制遗留表中的字段,并将新用户返回给调用者


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

设置一个后端,这是使用django的其他身份验证源的标准和推荐方法,这就是这个人应该做的。另外,在谷歌上快速搜索会发现很多auth后端,可以作为例子:)谢谢。也许我还不够清楚,但这正是我们要做的。(即,使用替代身份验证和用户的子类)。问题是,通过创建一个子类,ORM现在希望自定义表(我们的旧表)具有一个字段,该字段是原始django auth_用户表的外键。它抛出了一个错误,因为它不存在。设置一个后端来完成您需要的工作,这是使用Django的其他身份验证源的标准和推荐方法,所以这就是这个人应该做的。另外,在谷歌上快速搜索会发现很多auth后端,可以作为例子:)谢谢。也许我还不够清楚,但这正是我们要做的。(即,使用替代身份验证和用户的子类)。问题是,通过创建一个子类,ORM现在希望自定义表(我们的旧表)具有一个字段,该字段是原始django auth_用户表的外键。它抛出一个错误,因为它不存在。