Python django为用户提供多个数据库和外键
假设我的服务器上有一个django应用程序,但我希望使用django.contrib.auth.models进行身份验证,其中用户和组模型/数据位于另一个数据库的另一台服务器上。在Django中,我的数据库设置如下:Python django为用户提供多个数据库和外键,python,django,django-models,multiple-databases,django-database,Python,Django,Django Models,Multiple Databases,Django Database,假设我的服务器上有一个django应用程序,但我希望使用django.contrib.auth.models进行身份验证,其中用户和组模型/数据位于另一个数据库的另一台服务器上。在Django中,我的数据库设置如下: DATABASES = { 'default': {}, 'auth_db': { 'NAME' : 'my_auth_db', 'ENGINE' : 'django.db.backends.mysql',
DATABASES = {
'default': {},
'auth_db': {
'NAME' : 'my_auth_db',
'ENGINE' : 'django.db.backends.mysql',
'USER' : 'someuser',
'PASSWORD' : 'somepassword',
'HOST' : 'some.host.com',
'PORT' : '3306',
},
'myapp': {
'NAME': 'myapp_db',
'ENGINE': 'django.db.backends.mysql',
'USER': 'localuser',
'PASSWORD': 'localpass',
}
}
DATABASE_ROUTERS = ['pathto.dbrouters.AuthRouter', 'pathto.dbrouters.MyAppRouter']
第一个问题:这是否有效,即它是否允许我使用存储在远程数据库“my_auth_DB”中的用户登录到Django应用程序
假设上面的答案是肯定的,如果在我的本地数据库(应用程序“myapp”)中,我的模型具有用户的外键,会发生什么情况?换句话说,my model SomeModel是在myapp中定义的,应该存在于myapp_数据库中,但它在my_auth_数据库中有一个用户的外键:
class SomeModel(models.model):
user = models.ForeignKey(User, unique=False, null=False)
description = models.CharField(max_length=255, null=True)
dummy = models.CharField(max_length=32, null=True)
etc.
第二个问题:对于一个DB表来说,在另一个DB表中有一个ForeignKey是可能的还是根本不可能的
如果我真的想这样做,我可以用一个整型字段“user\u id”替换ForeignKey字段“user”,然后如果我需要somemodel.user,我可以取而代之的是somemodel.user\u id并使用models.user.objects.get(pk=somemodel.user\u id),路由器知道在这里为用户查询auth\u db吗?这是一种可行的方法吗?问题1的答案是:是的 在任何情况下,您都需要一个(Django文档中的示例正是关于auth应用程序的,因此无需在此处复制此代码) 问题2的答案是:也许吧。不是正式的。这取决于您如何设置MySQL: Django目前不支持跨多个数据库的外键或多对多关系 这是因为引用完整性 但是,如果将SQLite或MySQL与MyISAM表一起使用,则不存在强制引用完整性;因此,您可能能够“伪造”跨数据库外键。但是,Django不正式支持此配置 我有一个带有几个传统MySQL数据库(只读)的设置。这个答案表明 我后来遇到了问题,解决方案(如接受答案中所述)是用引号设置表名:
class Meta:
db_table = '`%s`.`table2`' % db2_name
可能提供一些额外信息的相关问题:
如果有人能将所有这些信息输入Django官方文档,那就太好了:-)这是一个非常好的信息,谢谢!从我在这里看到的,人们似乎创建了各种复杂的解决方案,只是为了能够使用somemodel.user语法访问模型。因为这只是一个测试应用程序,所以我想我将使用一个普通的IntegerField并存储user\u id,并使用一些单独的函数(例如)获取像这样的somemodel的用户:user=user.objects.get(pk=somemodel.user\u id)。看起来这仍然有效。它不会具有引用完整性,即如果有人删除了一个用户,那么这种方法将不会自动删除具有User_id的我的SomeModel实例。是的,这些都是复杂的解决方法,但所有更改请求都会被Django拒绝,所以这就是我们要解决的问题。。。如果性能不是一个很大的问题,那么
user=user….
方法是可以的,但是它会触发一个额外的查询来读取您正在访问的每个对象的用户,而一个扩展ForeignKey可以在一个查询中完成(前提是DBs在同一台服务器上)