帮助管理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有两个有用的功能:

  1. 所有ModelChoiceFields和ModelMultipleEchoiceFields都已筛选其QuerySets,以仅显示当前租户的值。 这在表单类实例化期间发生。
  2. 表单的clean()方法将实例的租户字段设置为当前登录用户的租户字段。
  3. < > >

    示例:

    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()

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java异步任务必须是抽象的   java从ArrayList更改对象中的变量<Object>   JAVAlang.NoClassDefFoundError与ANT生成的JAR   java如何创建卡片组构造函数   java JPA EclipseLink和@TableGenerator。为什么事务回滚后分配给id的值不为空?   java是一种简单的混合JTextField/JPasswordField的方法吗?   javajaxb(JAXWS):值为null时为空标记   关于ListActivity、游标和SQL数据更新的java问题   JFrame的java无响应KeyListener   堆栈Java类型转换。对象指向自定义类的实例   eclipse在我的java项目中使用其他java文件   Java字符串引用与new不同,与new相同   java游戏介绍页。使用JFrame   在java中设置代理   java轻松打印阿拉伯数字的方法   Java“优化”:低级类中的if控件   java在页面加载之前是否可以填充JSF视图?   升级到spring boot v2后java应用程序未启动。5.2   Spring模型类中的java静态工厂方法   java Lucene令牌流异常