如何使用Django让两种类型的用户使用不同的登录名?

时间:2018-08-05 10:15:36

标签: django django-models

我有两种类型的用户美术师和客户。到目前为止,我有这个 在models.py

class User(AbstractBaseUser, PermissionsMixin):
    Email = models.EmailField(unique=True)

    USERNAME_FIELD = 'Email'
    objects = MyUserManager()


class Customers(models.Model):
    User = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    CustomerID = models.AutoField(primary_key=True)

class Artists(models.Model):
    User = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    ArtistID = models.AutoField(primary_key=True)

我使用电子邮件作为身份验证,直到艺术家也想成为客户,这是一件好事。 并且他/她不能有两个帐户,一个帐户是“客户”,另一个帐户是“艺术家”,具有相同的电子邮件地址。

这是我的问题:

  1. 这种实施方式正确吗?如果没有,该怎么办?
  2. 让用户同时成为Artist和Customer的最佳方式是什么?这有安全性问题吗?

2 个答案:

答案 0 :(得分:1)

我发现从Users派生子类通常是个坏主意。

相反,使用custom user model并为各种角色添加标志(是的,我是故意从AbstractUser派生的;许多应用期望.username是一件事情,并且您可以始终假设username == email):

class User(AbstractUser, PermissionsMixin):
    is_customer = models.BooleanField(default=False)
    is_artist = models.BooleanField(default=False)

我还建议研究类似django-allauth的应用程序(它将与自定义用户模型一起使用),以简化整个注册/登录/密码更改/电子邮件确认流程。

答案 1 :(得分:0)

为解决我的问题,我做了一些更改,在Artist和Customer之间创建了一个OneToOne关系。像下面的代码:

class User(AbstractBaseUser, PermissionsMixin):
    Email = models.EmailField(unique=True)

    USERNAME_FIELD = 'Email'
    objects = MyUserManager()


class Customers(models.Model):
    User = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    CustomerID = models.AutoField(primary_key=True)

class Artists(models.Model):
    Customer = models.OneToOneField(Customers, on_delete=models.CASCADE)
    ArtistID = models.AutoField(primary_key=True)