You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django用户认证:如何实现租户与用户的一对多关联

实现一个租户对应多个用户的Django模型设计方案

问题分析

你当前的Tenants模型把外键放在了租户侧,导致一个租户只能绑定一个用户,不符合“一个租户包含多个用户”的需求。正确逻辑应该是多个用户归属同一个租户,需要调整外键位置或使用多对多关联。

解决方案

方案1:一对多关联(推荐,适用于用户仅属于一个租户的场景)

将外键从Tenants模型移至用户模型,让每个用户关联一个租户,这样一个租户就能对应多个用户。

如果使用自定义用户模型(推荐扩展AbstractUser),代码示例如下:

from django.contrib.auth.models import AbstractUser
from django.db import models
from django.conf import settings

class CustomUser(AbstractUser):
    # 允许用户暂时不属于任何租户(null=True, blank=True)
    tenant = models.ForeignKey('Tenants', on_delete=models.SET_NULL, null=True, blank=True, related_name='users')

class Tenants(models.Model):
    empresa = models.CharField(max_length=60, null=False, blank=False)
    sub_dominio = models.CharField(max_length=60, null=True, blank=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_by = models.CharField(max_length=20, null=False, blank=False)

    class Meta:
        verbose_name_plural = "Tenants"

    def __str__(self):
        return self.empresa
  • 关联数据访问方式:
    • 获取某租户下的所有用户:tenant_instance.users.all()
    • 获取某用户所属的租户:user_instance.tenant

方案2:多对多关联(适用于用户可属于多个租户的场景)

如果需要支持用户同时归属多个租户,可使用ManyToManyField配合中间表,还能扩展关联的额外信息(如角色、加入时间)。

from django.db import models
from django.conf import settings

class UserTenant(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    tenant = models.ForeignKey('Tenants', on_delete=models.CASCADE)
    # 可选:添加关联的额外字段
    join_date = models.DateTimeField(auto_now_add=True)
    role = models.CharField(max_length=20, default='member')

class Tenants(models.Model):
    empresa = models.CharField(max_length=60, null=False, blank=False)
    sub_dominio = models.CharField(max_length=60, null=True, blank=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_by = models.CharField(max_length=20, null=False, blank=False)
    # 通过中间表关联用户
    users = models.ManyToManyField(settings.AUTH_USER_MODEL, through='UserTenant', related_name='tenants')

    class Meta:
        verbose_name_plural = "Tenants"

    def __str__(self):
        return self.empresa
  • 关联数据访问方式:
    • 获取某租户下的所有用户:tenant_instance.users.all()
    • 获取某用户所属的所有租户:user_instance.tenants.all()
    • 获取用户在租户中的角色:user_tenant_instance.role

注意事项

  1. 若使用自定义用户模型,需在settings.py中配置:AUTH_USER_MODEL = '你的应用名.CustomUser'
  2. 修改模型后需执行迁移命令:python manage.py makemigrations 和 python manage.py migrate

内容的提问来源于stack exchange,提问作者Jorge López

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 14:36:14