mysql - 带有表前缀的 Django 项目
问题描述
我必须运行 2 个不同的 Django 项目,它们必须共享同一个数据库。
他们必须共享同一个数据库,因为我需要在 2 个项目之间使用 Django 模型关系(Django 不允许跨多个数据库的关系)
有没有办法拥有一个全局前缀变量,以便 Django 自动使用它来生成所有表?例如:
- project1_auth_user
- project2_auth_user
- ...
- project1_django_migrations
- project2_django_migrations
- ...
解决方案
到目前为止,我已经这样解决了:
我为每个项目创建了一个名为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 前缀。
推荐阅读
- angular - 试图区分'[object Object]'。Angular 中只允许使用数组和可迭代对象
- python - 递归 Python 函数 - 似乎无法存储值
- angular - 在 Angular 中,如何使用 Route 转到完全不同的 URL?换句话说,您如何关闭匹配?
- c - 将 _Generic 与其他宏结合
- google-bigquery - YouTube BigQuery 频道转移似乎并未导入所有视频
- arrays - 将指向数组的指针传递给函数有什么好处吗?
- facebook-opengraph - 使我的 FB 目录产品图像(微数据)与我的共享图像(og:image)不同
- java - Android Admob 奖励广告未显示奖励广告
- python - 在包含 savefig 的 for 循环中初始化 LSTM 权重(keras)时,SVD 未收敛
- excel - 在数字范围的范围内找到最小的数字范围