Django多个数据库外键

时间:2019-09-05 11:51:12

标签: django postgresql multiple-databases

我正在尝试为我的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 migratepython manage.py migrate --database=comment进行所有迁移。

1 个答案:

答案 0 :(得分:0)

抱歉,但是无法在Django中重新创建跨数据库关系。您可以在Django docs中找到完整的说明。

此外,您甚至无法在PostgreSQL中进行跨数据库关系,因此即使尝试在Django之外进行破解或实现它也将无法实现。也许对于其他数据库引擎而言,您可以进行自己的研究。

相关问题