我使用 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}'