django 具有多个数据库和用户外键

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 ?这是一个可行的方法吗?

mas*_*oda 5

问题1的答案是:是的。

\n

在任何情况下,您都需要一个数据库路由器(Django 文档中的示例正是关于身份验证应用程序,因此无需在此处复制此代码)。

\n

问题2的答案是:也许吧。不是正式的。这取决于您如何设置 MySQL:

\n

https://docs.djangoproject.com/en/dev/topics/db/multi-db/#limitations-of-multiple-databases

\n
\n

Django目前不提供对跨多个数据库的外键或多对多关系的任何支持。

\n

这是因为引用完整性

\n

然而,如果您\xe2\x80\x99使用带有MyISAM表的SQLite或MySQL,则没有强制的引用完整性;因此,您可能能够\xe2\x80\x98fake\xe2\x80\x99 跨数据库外键。然而,Django 官方并不支持这种配置。

\n
\n

我有几个旧版 MySQL DB(只读)的设置。这个答案显示了如何在不同的数据库中使用具有外键的 django 模型?

\n

后来我在使用多个数据库时遇到了 Django ManyToMany 的麻烦,解决方案(如已接受的答案中所述)是用引号设置表名:

\n
class Meta:    \n    db_table = \'`%s`.`table2`\' % db2_name\n
Run Code Online (Sandbox Code Playgroud)\n

可能提供一些附加信息的相关问题:

\n

如何解决 Django 中缺乏跨数据库外键支持的问题

\n

如何在不同的数据库中使用带有外键的django模型?

\n

如果有人能将所有这些信息放入 Django 官方文档中,那就太好了:-)

\n