Mar*_*arc 3 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',
'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']
Run Code Online (Sandbox Code Playgroud)
第一个问题:这是否有效,即它是否允许我使用存储在远程数据库“my_auth_db”中的用户登录到我的 Django 应用程序?
假设上述答案是肯定的,如果在我的本地数据库(应用程序“myapp”)中我的模型具有针对用户的外键,会发生什么情况?换句话说,我的模型 SomeModel 是在 myapp 中定义的,并且应该存在于 myapp_db 中,但它在 my_auth_db 中具有指向用户的外键:
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.
Run Code Online (Sandbox Code Playgroud)
第二个问题:这可能吗?或者一个数据库表根本不可能拥有另一个数据库中的表的外键?
如果我真的想完成这项工作,我可以将ForeignKey字段“user”替换为IntegerField“user_id”,然后如果我需要somemodel.user,我会改为获取somemodel.user_id并使用models.User.objects.get(pk =somemodel.user_id),路由器知道在哪里查询用户的 auth_db ?这是一个可行的方法吗?
问题1的答案是:是的。
\n在任何情况下,您都需要一个数据库路由器(Django 文档中的示例正是关于身份验证应用程序,因此无需在此处复制此代码)。
\n问题2的答案是:也许吧。不是正式的。这取决于您如何设置 MySQL:
\nhttps://docs.djangoproject.com/en/dev/topics/db/multi-db/#limitations-of-multiple-databases
\n\n\nDjango目前不提供对跨多个数据库的外键或多对多关系的任何支持。
\n这是因为引用完整性。
\n然而,如果您\xe2\x80\x99使用带有MyISAM表的SQLite或MySQL,则没有强制的引用完整性;因此,您可能能够\xe2\x80\x98fake\xe2\x80\x99 跨数据库外键。然而,Django 官方并不支持这种配置。
\n
我有几个旧版 MySQL DB(只读)的设置。这个答案显示了如何在不同的数据库中使用具有外键的 django 模型?
\n后来我在使用多个数据库时遇到了 Django ManyToMany 的麻烦,解决方案(如已接受的答案中所述)是用引号设置表名:
\nclass Meta: \n db_table = \'`%s`.`table2`\' % db2_name\nRun Code Online (Sandbox Code Playgroud)\n可能提供一些附加信息的相关问题:
\n\n\n如果有人能将所有这些信息放入 Django 官方文档中,那就太好了:-)
\n| 归档时间: |
|
| 查看次数: |
4560 次 |
| 最近记录: |