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

时间:2017-11-01 00:06:14

标签: python django django-models multiple-databases django-database

假设我的服务器上有一个django应用程序,但我希望使用django.contrib.auth.models进行身份验证,其中User和Group模型/数据位于另一个数据库的另一台服务器上。在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']

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

假设上面的答案是肯定的,如果在我的本地数据库(应用程序'myapp')中,我的模型对用户有一个ForeignKey会怎么样?换句话说,我的模型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.

第二个问题:这是可能的还是一个DB表根本不可能有一个ForeignKey到另一个DB中的表?

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

1 个答案:

答案 0 :(得分:2)

问题1的答案是:是的。

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

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

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

  

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

     

这是因为参照完整性

     

但是,如果您使用SQLite或 MySQL与MyISAM 表,则没有强制参照完整性;因此,您可以'伪造'跨数据库外键。但是,Django并未正式支持此配置。

我有几个遗留MySQL数据库(readonly)的设置。这个答案显示How to use django models with foreign keys in different DBs?

我后来遇到了Django ManyToMany through with multiple databases的麻烦,解决方案(如接受的答案中所述)是用引号设置表名:

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官方文档中,那将是很好的: - )