{"id":17274283,"url":"https://github.com/ansgoo/djangomultitenant","last_synced_at":"2025-04-14T08:53:06.763Z","repository":{"id":57420972,"uuid":"401358589","full_name":"AnsGoo/djangoMultiTenant","owner":"AnsGoo","description":"Django 多租户实现，实现了数据库层的租户数据隔离，兼容django.auth、admin、migrate等模块，支持rest_framework,支持django默认支持的所有数据库","archived":false,"fork":false,"pushed_at":"2023-01-08T00:51:23.000Z","size":152,"stargazers_count":15,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-27T22:23:13.378Z","etag":null,"topics":["django","multitenancy","multitenant","python3"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AnsGoo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-08-30T13:44:40.000Z","updated_at":"2024-08-09T14:54:20.000Z","dependencies_parsed_at":"2023-02-08T04:00:56.298Z","dependency_job_id":null,"html_url":"https://github.com/AnsGoo/djangoMultiTenant","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AnsGoo%2FdjangoMultiTenant","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AnsGoo%2FdjangoMultiTenant/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AnsGoo%2FdjangoMultiTenant/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AnsGoo%2FdjangoMultiTenant/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AnsGoo","download_url":"https://codeload.github.com/AnsGoo/djangoMultiTenant/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248852107,"owners_count":21171839,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["django","multitenancy","multitenant","python3"],"created_at":"2024-10-15T08:53:32.103Z","updated_at":"2025-04-14T08:53:06.736Z","avatar_url":"https://github.com/AnsGoo.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DjangoMultiTenant\n\ndjango 多租户方案实现方案，本插件的是在数据库层对租户数据进行了隔离，保证每个租户只能访问自己的数据库信息，完整兼容django所有功能\n\n## 安装\n\n```shell\npip install django-multi-tenancy\n```\n\n## 兼容性\n\n- django \u003e= 3.2\n\n其他django版本未测试，不保证兼容性\n\n## 配置\n\n```python\n\nINSTALLED_APPS = [\n    'multi_tenant.tenant',\n    'django.contrib.admin',\n    'django.contrib.auth',\n    'django.contrib.contenttypes',\n    'django.contrib.sessions',\n    'django.contrib.messages',\n    'django.contrib.staticfiles',\n    ...\n    'multi_tenant.proxy',\n    #  rest_framework 需要加载rest app\n    'multi_tenant.rest'\n]\n\nMIDDLEWARE = [\n    'django.middleware.security.SecurityMiddleware',\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    'corsheaders.middleware.CorsMiddleware',\n    'django.middleware.common.CommonMiddleware',\n    'django.middleware.csrf.CsrfViewMiddleware',\n    # 需要注释官方自带的AuthenticationMiddleware，采用插件的MultTenantAuthenticationMiddleware\n    # 'django.contrib.auth.middleware.AuthenticationMiddleware',\n    'multi_tenant.tenant.middleware.authentication.MultTenantAuthenticationMiddleware',\n    'django.contrib.messages.middleware.MessageMiddleware',\n    'django.middleware.clickjacking.XFrameOptionsMiddleware',\n]\n\n# AUTH_USER_MODEL 全局用户模型,必须指定\nAUTH_USER_MODEL = 'tenant.GlobalUser'\n\n# 租户用户模型,不指定默认为：'auth.User'\nAUTH_TENANT_USER_MODEL = 'info.User'\n\n# 租户模型,不指定默认为：'tenant.Tenant'\nDEFAULT_TENANT_MODEL = 'tenant.Tenant'\n\n## 数据库映射，这里只需要定义共用的app\nDATABASE_APPS_MAPPING = {\n    'tenant': 'default',\n    'admin': 'default',\n    'sessions': 'default'\n}\n\n## 数据库映射路由\nDATABASE_ROUTERS = ['multi_tenant.tenant.utils.db.MultTenantDBRouter']\n\n```\n\n## 主要模块说明以及使用\n\n### 数据库模块\n\n1. 默认`default`数据库为主数据库,只保存公共模块数据，租户数据库可以动态创建，创建一个租户，会自动在数据库中创建了一个对应租户的数据库，所有租户的数据库结构相同\n\n2. 可以在`DATABASE_APPS_MAPPING`中指定某个`app`属于公共`app`,还是租户`app`,公共`app`默认数据库链接为`default`\n\n### `multi_tenant.tenant` 多租户模块\n\n\n1. `Tenant`为租户模型，当然你可以继承`AbstractTenant`来自定义自己的租户模块，并在`settings`中指定`DEFAULT_TENANT_MODEL`常量来指定租户模型\n\n2. `GlobalUser` 为全局用户，不分数据哪个租户，这里用`GlobalUser`替代了`django.contrib.auth.models.User`模块，因此`django.contrib.auth.get_user_model` 获取的是`GlobalUser`对象，相应的`request.user`也是`GlobalUser`对象，用户可以被加入租户，也可以选择不加入租户，加入租户的用户只能访问相应租户数据，不加入租户的用户如果是超级管理员可以访问`全局用户`和`租户信息`\n\n3. 租户用户表默认采用`django.contrib.auth.models.User`,当然你可以选择继承`django.contrib.auth.models.AbstractUser`来自定义自己的租户用户模块，并在settings中指定`AUTH_TENANT_USER_MODEL`常量来指定租户用户，用户可以在租户层面完整的使用`django.contrib.auth`所有功能，包括`User`、`Group`、`Permission`、`Admin`\n\n4. 可以登录Admin 后台创建租户，也可以使用`createtenant`命令行来创建租户\n\n\n### `multi_tenant.proxy` 代理模块\n\n`ProxyContentType`contentType代理，因为在多租户模型中，主数据库和租户数据库数据模型不一样，在不断的迭代更新中，新的租户和老的租户模型`ContentType`数据信息也不一样，django默认自带的`ContentType`模型默认自带缓存，`ProxyContentType`模型无缓存，每次的数据访问都是直接访问数据库，这样避免了`ContentType`信息不一致导致的异常\n\n\n### `multi_tenant.rest` rest_framework适配模块\n\n1. 对`rest_framework`进行了适配,保证租户只能访问自己的租户的数据\n2. 提供了一个`IsTanenatUser`权限类，判断是不是租户用户\n3. 适配了`rest_framework`的内置权限`IsAdminUser`、`DjangoModelPermissions`、`DjangoModelPermissionsOrAnonReadOnly`、`DjangoObjectPermissions`\n\n\n\n### `migrate` 模块\n\n1. 迁移租户数据库，请给`migrate` 指定`--database`参数值, `--database`\n2. 也可以使用`multimigrate`,必须指定`--database`参数值，或者直接使用`--all`,来迁移所有租户表结构\n\n\n\n## 支持的数据库\n\n适配了支持`django`所有支持的数据库（`SQLite3`、`MySQL`、`Posgres`、`Oracle`）\n\n\n## 例子\n\n可以参考`examples`的使用\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fansgoo%2Fdjangomultitenant","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fansgoo%2Fdjangomultitenant","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fansgoo%2Fdjangomultitenant/lists"}