我使用 AbstractUser 类来扩展我的 User 类。在我的用户班级中,目前有 3 个角色:管理员、讲师和校友。我可以用
is_superuser
,is_staff
来解决这个问题,但是,以后可能会出现更多的角色,如果我用上面的方法,就不能更好地添加更多的角色了。但如果我使用附加字段role = models.IntegerField(choices=Role.choices, default=Role.ALUMNI)
,它看起来不错。但是当使用 superuser
、is_superuser = True
并且用户的角色是校友时。
顺便说一下,我正在开发一个使用 django、rest_framework 的项目。我希望管理员创建具有讲师角色的用户并设置默认密码,并且在帐户创建后 24 小时后,如果讲师不更改密码,该帐户将被锁定,管理员将拥有重新为讲师重新开放。我写了两个函数 save
和 check_password_expiry
但我不确定它是否按我想要的方式工作。
有人可以解决我目前的问题吗?
class User(AbstractUser):
class Role(models.IntegerChoices):
ADMIN = 1, "Admin"
LECTURER = 2, "Lecturer"
ALUMNI = 3, "Alumni"
avatar = CloudinaryField(null=True)
cover = CloudinaryField(null=True)
role = models.IntegerField(choices=Role.choices, default=Role.ALUMNI)
alumni = models.OneToOneField(Alumni, on_delete=models.CASCADE, null=True, blank=True)
friends = models.ManyToManyField('self', symmetrical=True, blank=True)
def save(self, *args, **kwargs):
if self.role == User.Role.LECTURER and not self.password:
self.set_password('ou@123')
super().save()
def check_password_expiry(self):
if self.role == User.Role.LECTURER:
if timezone.now() - self.date_joined > timedelta(hours=24):
self.is_active = False
self.save()
def __str__(self):
return f'{self.last_name} {self.first_name}'
将
role
添加到 REQUIRED_FIELDS
[Django-doc]:
class User(AbstractUser):
REQUIRED_FIELDS = ['role']
# …
正如文档所述:
通过
createsuperuser
管理命令创建用户时将提示输入的字段名称列表。系统将提示用户为每个字段提供一个值。它必须包含任何空白为False
或未定义的字段,并且可能包含您希望在交互创建用户时提示的其他字段。REQUIRED_FIELDS
对 Django 的其他部分没有影响,例如在管理员中创建用户。