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

django with multiple databases and foreignkeys for User

假设我的服务器上有一个 django 应用程序,但我希望使用 django.contrib.auth.models 进行身份验证,其中用户和组 models/data 在另一个数据库的另一个服务器上。在 Django 中,我的 DATABASES 设置是这样的:

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']

第一个问题:这是否可行,即它是否允许我使用存储在远程数据库中的用户登录我的 Django 应用程序 'my_auth_db'?

假设以上问题的答案是肯定的,如果在我的本地数据库(应用 'myapp')中我的模型具有用户的外键,会发生什么情况?换句话说,我的模型 SomeModel 是在 myapp 中定义的,应该存在于 myapp_db 中,但它在 my_auth_db:

中有一个用户的 ForeignKey
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.

第二个问题:对于一个数据库 table 来说,是否有可能将外键指向另一个数据库中的 table?

如果我真的想让这个工作,我可以用 IntegerField 'user_id' 替换 ForeignKey 字段 'user' 然后如果我需要 somemodel.user 我会得到 somemodel.user_id 并使用 models.User.objects.get(pk=somemodel.user_id),其中路由器知道为用户查询 auth_db?这是可行的方法吗?

问题 1 的答案是:是。

在任何情况下,您都需要 database router(Django 文档中的示例正是关于 auth 应用程序的,因此无需在此处复制此代码)。

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

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

Django doesn’t currently provide any support for foreign key or many-to-many relationships spanning multiple databases.

This is because of referential integrity.

However, if you’re using SQLite or MySQL with MyISAM tables, there is no enforced referential integrity; as a result, you may be able to ‘fake’ cross database foreign keys. However, this configuration is not officially supported by Django.

我有一个包含多个遗留 MySQL 数据库(只读)的设置。此答案显示 How to use django models with foreign keys in different DBs?

我后来 运行 遇到了 的麻烦,解决方案(如接受的答案中所述)是用引号设置 table 名称:

class Meta:    
    db_table = '`%s`.`table2`' % db2_name

可能提供一些额外信息的相关问题:

How to work around lack of support for foreign keys across databases in Django

How to use django models with foreign keys in different DBs?

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