Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django为用户提供多个数据库和外键_Python_Django_Django Models_Multiple Databases_Django Database - Fatal编程技术网

Python 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',

假设我的服务器上有一个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']
第一个问题:这是否有效,即它是否允许我使用存储在远程数据库“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在同一台服务器上)