我正在尝试为我的Django(1.11版)应用实现多种数据库支持。为此,我将settings.py
包括在内:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'labrin_dbase',
'USER': 'labrin_admin',
'PASSWORD': 'ndzwwZHv63STuvAF?C_$L@j@*@epZXaX',
'HOST': 'localhost',
'PORT': '5432',
},
'comment': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'labrin_dbase_comments',
'USER': 'labrin_admin_comments',
'PASSWORD': 'adzwaTHv63STuvAF!C_$L@j@*@epZXaY',
'HOST': 'localhost',
'PORT': '5433',
}
}
DATABASE_ROUTERS = [
'labrin_task.comment_router.CommentRouter',
]
我的数据库路由器的配置如下:
class CommentRouter(object):
def db_for_read(self, model, **hints):
if model._meta.db_table == 'todo_comment':
return 'comment'
return None
def db_for_write(self, model, **hints):
if model._meta.db_table == 'todo_comment':
return 'comment'
return None
def allow_relation(self, obj1, obj2, **hints):
return True
def allow_migrate(self, db, app_label, model_name=None, **hints):
if model_name == 'comment':
return db == 'comment'
return None
“待办事项” app
(这是项目中的唯一应用程序)中的模型:
from django.db import models
from django.contrib.auth import get_user_model
UserModel = get_user_model()
class Todo(models.Model):
name = models.CharField(max_length=64)
description = models.TextField()
author = models.ForeignKey(UserModel, on_delete=models.CASCADE)
deadline = models.DateTimeField()
created_at = models.DateTimeField(auto_now_add=True)
class Comment(models.Model):
todo = models.ForeignKey(Todo, on_delete=models.CASCADE)
author = models.ForeignKey(UserModel, on_delete=models.CASCADE)
text = models.CharField(max_length=256)
created_at = models.DateTimeField(auto_now_add=True)
class ShareTodo(models.Model):
todo = models.ForeignKey(Todo, on_delete=models.CASCADE)
with_user = models.ForeignKey(UserModel, on_delete=models.CASCADE)
comment_allowed = models.BooleanField(default=False)
当我从comment
删除DATABASE_ROUTERS
数据库和settings.py
时,我的应用程序正常运行。将提到的内容添加到settings.py
后,当我创建Comment
对象时,我的应用返回错误。错误提示:
Exception inside application: insert or update on table "todo_comment" violates foreign key constraint "todo_comment_author_id_bb272a3e_fk_auth_user_id"
DETAIL: Key (author_id)=(1) is not present in table "auth_user".
我在做什么错了?
注意::我将两个Postgres服务器作为单独的Docker容器启动,并且在运行容器之后,我运行python manage.py migrate
和python manage.py migrate --database=comment
进行所有迁移。
答案 0 :(得分:0)
抱歉,但是无法在Django中重新创建跨数据库关系。您可以在Django docs中找到完整的说明。
此外,您甚至无法在PostgreSQL中进行跨数据库关系,因此即使尝试在Django之外进行破解或实现它也将无法实现。也许对于其他数据库引擎而言,您可以进行自己的研究。