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

如何在Django CustomUser中整合多用户类型及实现后续用户管理

Django用户模型整合与管理问题

项目背景

我正在实现一个区域管理系统,已建模的实体包括:

  • Building
  • Area
  • Area equipment(如家具等)
  • SpaceUser(空间与用户的关联)
  • SpaceRequirement(用户的申请)
  • Users(曾在、正在及将使用空间的用户)
  • Supervisor(负责特定区域或建筑的用户)
  • TypeOfUse(如办公室、实验室等)
  • Organization(所属团队/部门等组织)
  • Landlord

特殊场景(临时预订车间空间)涉及实体:

  • WorkshopSpace(建筑y中的空间x)
  • WorkshopSpaceRequirement(用户的申请)

现有模型代码:

class Supervisor(models.Model):
    firstname = models.CharField(max_length=100)
    lastname = models.CharField(max_length=100)
    organisation = models.ForeignKey('Organization', verbose_name='Organization', on_delete=models.CASCADE)
    email = models.EmailField(verbose_name='Email')
    phone_number = models.CharField(max_length=20)


class User(models.Model):
    organisation = models.ForeignKey('Organization', verbose_name='Organization', on_delete=models.CASCADE)
    firstname = models.CharField(max_length=100)
    lastname = models.CharField(max_length=100)
    mgmt_level = models.CharField(max_length=10, choices=CATEGORY_CHOICES, default=E4, verbose_name='Level')
    cost_center = models.CharField(max_length=50, blank=True)
    number_employees = models.IntegerField(default=0, verbose_name='Number of employees')
    number_workstations = models.IntegerField(default=0, verbose_name='Number of workstations')
    superior = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True)
    comment = models.TextField(blank=True)

之前实现时未考虑Django用户模型,现在希望通过继承AbstractUser的CustomUser修正,有两个问题:

  1. 是否可以将User和Supervisor两个实体及其所有属性整合到CustomUser中?
  2. 后续在Django中如何进行用户管理,比如超级用户先创建用户之后再分配给真实用户的场景?

回答

问题1:整合User与Supervisor到CustomUser

完全可以整合,且这是合理的设计。Supervisor本质也是系统中的用户,只是拥有额外的管理职责,没必要拆成两个独立模型。

实现思路:

  1. 继承AbstractUser创建CustomUser,合并原User和Supervisor的所有属性,同时保留AbstractUser自带的username、email、is_active等字段(原模型的email可直接复用)。
  2. 添加角色标记字段,区分普通用户、区域管理员(Supervisor)、超级用户等,示例代码:
from django.contrib.auth.models import AbstractUser

ROLE_CHOICES = (
    ('user', '普通用户'),
    ('supervisor', '区域管理员'),
    ('admin', '超级管理员'),
)

class CustomUser(AbstractUser):
    # 原User模型属性
    organisation = models.ForeignKey('Organization', verbose_name='所属组织', on_delete=models.CASCADE)
    mgmt_level = models.CharField(max_length=10, choices=CATEGORY_CHOICES, default=E4, verbose_name='管理级别')
    cost_center = models.CharField(max_length=50, blank=True, verbose_name='成本中心')
    number_employees = models.IntegerField(default=0, verbose_name='下属员工数')
    number_workstations = models.IntegerField(default=0, verbose_name='工作站数量')
    superior = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True, verbose_name='上级')
    comment = models.TextField(blank=True, verbose_name='备注')
    
    # 原Supervisor模型属性
    phone_number = models.CharField(max_length=20, blank=True, verbose_name='联系电话')
    
    # 角色标记
    role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='user', verbose_name='用户角色')
    
    # 可选:若无需username,可设置USERNAME_FIELD为email
    # USERNAME_FIELD = 'email'
    # REQUIRED_FIELDS = ['first_name', 'last_name']
  1. 在settings.py中配置自定义用户模型:
AUTH_USER_MODEL = 'your_app.CustomUser'
  1. 数据迁移:如果已有存量数据,需编写迁移脚本将原User和Supervisor的数据合并到CustomUser,注意处理重复记录(比如同一人在两个模型都有数据的情况)。

问题2:超级用户预创建用户后分配给真实用户的管理方案

可以通过以下步骤实现:

  1. 预创建时设置临时状态:超级用户在后台创建用户时,设置临时密码,同时将is_active设为False(未激活状态)。
  2. 发送激活链接:通过Django邮件系统给用户邮箱发送激活链接,链接包含用户ID和签名(防止篡改)。用户点击链接后跳转至密码设置页面,完成设置后将is_active改为True。
  3. 优化后台管理:在Django Admin中自定义CustomUser管理界面,添加批量创建、发送激活邮件的操作,示例:
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import CustomUser

class CustomUserAdmin(UserAdmin):
    list_display = ('username', 'email', 'first_name', 'last_name', 'role', 'is_active')
    actions = ['send_activation_emails']
    
    def send_activation_emails(self, request, queryset):
        for user in queryset:
            # 生成带签名的激活链接
            from django.core.signing import Signer
            signer = Signer()
            token = signer.sign(user.id)
            activation_url = f"{request.scheme}://{request.get_host()}/activate/{token}/"
            # 发送激活邮件
            from django.core.mail import send_mail
            send_mail(
                '激活您的区域管理系统账户',
                f'请点击链接激活账户:{activation_url}',
                'admin@example.com',
                [user.email],
                fail_silently=False,
            )
        self.message_user(request, "激活邮件已发送")

admin.site.register(CustomUser, CustomUserAdmin)
  1. 权限控制:结合role字段与Django权限系统,限制不同角色的操作范围。比如超级用户可管理所有用户,区域管理员仅能处理负责区域内的用户申请。

内容的提问来源于stack exchange,提问作者TheHotch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 15:15:57