from django.contrib.auth.models import PermissionsMixin, AbstractUser from django.db import models # Create your models here. class Permission(models.Model): CODENAMES = [ ('view', '查看'), ('add', '新增'), ('edit', '编辑'), ('delete', '删除'), ] resource = models.CharField("资源标识", max_length=50) # 如 'article', 'menu', 'carousel' action = models.CharField("操作", max_length=10, choices=CODENAMES) desc = models.CharField("描述", max_length=100) class Meta: unique_together = ('resource', 'action') def __str__(self): return f"{self.resource}:{self.action}" class Role(models.Model): name = models.CharField("角色名称", max_length=50, unique=True) permissions = models.ManyToManyField('Permission', blank=True) def __str__(self): return self.name class Department(models.Model): name = models.CharField("部门名称", max_length=100, unique=True) parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, verbose_name="上级部门") order = models.IntegerField("排序", default=0) class Meta: verbose_name = "部门" verbose_name_plural = "部门管理" def __str__(self): return self.name class User(AbstractUser, PermissionsMixin): username = models.CharField("英文名/账号", max_length=30, unique=True) cname = models.CharField("中文名", max_length=30, blank=True) dept = models.ForeignKey('Department', on_delete=models.SET_NULL, null=True, blank=True, verbose_name="所属部门") is_active = models.BooleanField(default=True) USERNAME_FIELD = 'username' REQUIRED_FIELDS = [] def __str__(self): return f"{self.cname} ({self.username})" # 给 User 关联 Role(多对多) User.add_to_class('roles', models.ManyToManyField(Role, blank=True))