首页 > 解决方案 > 带有表前缀的 Django 项目

问题描述

我必须运行 2 个不同的 Django 项目,它们必须共享同一个数据库。

他们必须共享同一个数据库,因为我需要在 2 个项目之间使用 Django 模型关系(Django 不允许跨多个数据库的关系)

有没有办法拥有一个全局前缀变量,以便 Django 自动使用它来生成所有表?例如:

标签: mysqldjango

解决方案


到目前为止,我已经这样解决了:

我为每个项目创建了一个名为table_router.py的文件,我在默认应用程序中对其进行了初始化。

DEFAULT_APPS = [
  'commons.table_router',
  'django.contrib.contenttypes',
  'suit',
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
]

然后在这个文件中我有以下内容:

from django.conf import settings
from django.db.models.signals import class_prepared, pre_init

def add_db_prefix(sender, **kwargs):

    ours = sender._meta.managed
    prefix = getattr(settings, "project1_", None)

    if not ours:
        return

    if prefix and not sender._meta.db_table.startswith(prefix):
        sender._meta.db_table = prefix + sender._meta.db_table

pre_init.connect(add_db_prefix)
class_prepared.connect(add_db_prefix)

这样做是在模型的元信息中设置为由project1管理的所有模型,前缀project1_被添加到 Django 查找的表名中。这样做,Django 会读取带有 project1_ 前缀的 auth_ 和 django_ 表,否则会查找我在 Models table_name 中定义的表名(表不由 project1 管理,并且来自 project2)。

project2 的相同文件,但带有 project2 前缀。


推荐阅读