我想将我的Django应用程序的用户分为两类:
- 管理员(使用Django管理员的用户) - 继承自AbstractUser
- 用户(客户用户) - 继承自AbstractBaseUser
我想将这两种用户分开,因为AbstractUser
(is_staff
,is_superuser
,groups
,permissions
)的所有字段对我来说都无用客户用户以及权限和组,我只想实现不同的东西。这就是为什么,我想使用AbstractBaseUser
。
但是对于django管理员用户AbstractUser
类,这是完美的,尤其是权限功能。
class Admin(AbstractUser):
pass
class Customer(AbstractBaseUser):
pass
但是现在,有没有办法精确地为django管理员使用Admin
的用户模型?
并将Customer
模型用于我的其余应用。
我是否必须从头开始实施:
class MyUser(AbstractBaseUser):
username = models.CharField(max_length=30, unique=True)
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
email = models.EmailField()
is_active = models.BooleanField(default=False)
class Admin(MyUser, PermissionsMixin):
is_staff = models.BooleanField(default=True)
class Customer(MyUser):
# specific fields
pass
通过此实施,如果我将AUTH_USER_MODEL
设置为User
,则权限将无效,因为User
没有permissions
,is_superuser
和{{1} } fields。
如果将其设置为is_staff
,我将无法使用Admin
对Customers
进行身份验证。
那么你们有解决这个问题的方法吗?
答案 0 :(得分:5)
Django为您提供的方式似乎更灵活,适应未来。
User
模型,您可以覆盖它。无论如何,该模型具有权限,组等。OneToOne
个人资料模型。User.is_staff
属性。通过这种方式,您获得了许多很酷的东西(与两个完全不同的用户模型相比):
contrib.auth
和contrib.admin
模块。admin_site.has_permission()
即可。至于缺点。到目前为止您唯一指出的一个问题:您的客户将拥有(暂时不使用)权限。好吧,因为他们(以及组)只是单独的表,您的客户数据将没有存储开销的性能。
也就是说,与收益相比,开销是可以忽略的。我强烈建议保留Django的默认User
模型并在必要时进行扩展。