帮助管理django项目的多租户
django-simple-multitenant的Python项目详细描述
如何使用
型号
要使租户感知模型,只需将django multitenant的tenant model子类化。 例子:
from django.db import models from multitenant.models import TenantModel class BugReport(TenantModel) description = models.CharField(max_length=200)
TenantModel有一个名为Tenant_objects的租户感知管理器:
bugs = BugReport.tenant_objects.all()
这将显示"当前租户"拥有的所有实例。 通过检查request.user的用户配置文件的tenant字段,可以确定给定请求的当前租户。 如果是匿名用户,则当前租户将是基本租户。 有关详细信息,请参阅下面的基本租户部分。
表格
对于任何子类TenantModel的模型,都需要使用TenantModelForm而不是Django的ModelForm。 TenantModelForm有两个有用的功能:
- 所有ModelChoiceFields和ModelMultipleEchoiceFields都已筛选其QuerySets,以仅显示当前租户的值。 这在表单类实例化期间发生。
- 表单的clean()方法将实例的租户字段设置为当前登录用户的租户字段。 < > >
示例:
class CompanyForm(TenantModelForm): class Meta: model = Company
请注意,我们不必担心筛选每个表单字段的可用选项。
管理员
默认情况下,django admin将显示所有模型实例。在多租户项目中,您可能希望 "访问"租户的帐户,只查看属于他们的实例。如果你用Tenantadmin作为 modeladmin类,您将只看到当前登录用户(您自己)的实例。
然后,您可以通过更改链接到您自己的用户配置文件的租户来访问任何您喜欢的租户。
示例:
from django.contrib import admin from multitenant.admin import TenantAdmin from myapp.models import * admin.site.register(BugReport, TenantAdmin)
实用程序
要验证当前登录的租户是否拥有特定实例:
from multitenant.utils import current_tenant_owns_object if current_tenant_owns_object(obj): do_something()
django的get_object_或_404快捷方式的租户感知版本:
from multitenant.utils import tenant_get_object_or_404 tenant_get_object_or_404(BugReport, id=1)
要筛选queryset,使所有实例都属于当前登录的租户:
from multitenant.utils import tenant_filter bugs = BugReport.objects.all() bugs = tenant_filter(bugs)
要获取当前登录租户的租户实例:
from multitenant.middleware import get_current_tenant tenant = get_current_tenant()
在极少数情况下,例如在django管理命令中,可能需要手动设置当前租户 因为没有登录用户:
from multitenant.middleware import set_current_tenant, set_tenant_to_default if val: set_current_tenant( Tenant.objects.get(id=val) ) else: set_tenant_to_default()