在Django中设计用户类

问题描述 投票:0回答:1

我使用 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}'
django django-models django-rest-framework
1个回答
0
投票

role
添加到
REQUIRED_FIELDS
 [Django-doc]
:

class User(AbstractUser):
    REQUIRED_FIELDS = ['role']
    # …

正如文档所述:

通过 createsuperuser

 管理命令创建用户时将提示输入的字段名称列表。
系统将提示用户为每个字段提供一个值。它必须包含任何空白为 False
 或未定义的字段,并且可能包含您希望在交互创建用户时提示的其他字段。 
REQUIRED_FIELDS
 对 Django 的其他部分没有影响,例如在管理员中创建用户。

© www.soinside.com 2019 - 2024. All rights reserved.