django-tenants如何直接进入指定租户的Python shell运行环境
django-tenants 指定租户上下文Shell快捷实现
django-tenants 官方未提供直接进入指定租户shell的内置命令,可通过自定义manage命令实现,无需每次手动查询租户、编写with tenant_context(tenant)代码块。
实现步骤
- 在你存放租户模型的App下,新建如下目录结构,两个目录内都要创建空的
__init__.py文件保证Django能识别到自定义命令:
your_tenant_app/ ├── management/ │ ├── __init__.py │ └── commands/ │ ├── __init__.py │ └── tenant_shell.py
- 在
tenant_shell.py中写入如下代码,注意将导入的租户模型替换为你项目中实际使用的租户模型类:
from django.core.management.commands.shell import Command as ShellCommand from django_tenants.utils import tenant_context # 替换为你项目里的租户模型实际导入路径 from your_tenant_app.models import Tenant class Command(ShellCommand): help = "启动绑定指定租户上下文的Django Shell" def add_arguments(self, parser): super().add_arguments(parser) parser.add_argument( "-s", "--schema", dest="schema_name", required=True, help="指定目标租户的schema名称" ) def handle(self, *args, **options): schema_name = options.pop("schema_name") try: tenant = Tenant.objects.get(schema_name=schema_name) except Tenant.DoesNotExist: self.stderr.write(self.style.ERROR(f"错误:不存在schema名为{schema_name}的租户")) return with tenant_context(tenant): self.stdout.write(self.style.SUCCESS( f"成功进入租户上下文 | 租户标识:{getattr(tenant, 'name', schema_name)} | schema:{schema_name}" )) super().handle(*args, **options)
使用方式
直接在终端执行命令,传入目标租户的schema名即可:
./manage.py tenant_shell -s 目标租户schema名
- 进入Shell后所有ORM操作、代码执行默认处于指定租户上下文下,无需额外套上下文代码块
- 完全兼容原生
shell命令的所有参数,比如./manage.py tenant_shell -s my_tenant -i ipython可指定用IPython启动 - 如果习惯用域名定位租户,可将命令参数改为接收域名,查询租户时改为
Tenant.objects.get(domains__domain=传入的域名)即可
内容的提问来源于stack exchange,提问作者daniel kullmann
相关产品推荐
相关产品推荐

