我使用抽象用户类来扩展我的用户类.在我的用户类中,目前有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}'