扩展自定义用户模型-Django中的多种用户类型

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

我对django相对较新,但是很高兴学习这样一个通用的框架。我正在一个项目中,我将有2个用户类型,帐户1和帐户2。帐户2将能够“添加用户”到他们的帐户。将帐户2视为可以将用户添加到其公司的公司。

到目前为止,我已经扩展了通用用户模型并为每种帐户类型创建了一个类,但是我不确定自己是否做得正确。最终,我将要为每种帐户类型创建一个登录/注册表单-类似于ziprecruiter的功能,因此,如果可能的话,一些建议也非常实用。

class User(AbstractBaseUser, PermissionsMixin):
    email           = models.EmailField(_('email address'), unique=True)
    is_staff        = models.BooleanField(default=False)
    is_active       = models.BooleanField(default=True)
    date_joined     = models.DateTimeField(default=timezone.now)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = []

    objects = UserManager()

    def __str__(self):
        return self.email

class account1(User):
    profile         = models.ForeignKey(User, on_delete=models.CASCADE, related_name='+', null=True)
    # account 2 fields here
    first_name      = models.TextField(max_length=30, blank=True)
    last_name       = models.TextField(max_length=30, blank=True)
    location        = models.TextField(max_length=30, blank=True)

    class Meta:
        db_table = 'account1_user'

class account2(User):
    profile = models.ForeignKey(User, on_delete=models.CASCADE, related_name='+')
    # account2 user fields here

    class Meta:
        db_table = 'account2_user'

我正确执行此操作吗?为每种类型的帐户创建登录/注册表单的最佳方法是什么?创建允许用户类型的用户(如果可行)的模型的最佳方法是什么?

python django
1个回答
0
投票

经验法则与您的业务逻辑无关,始终为您的应用程序使用一个用户模型。如果要使用多种类型的用户,则可以使用属性来确定用户类型。例如,在我的应用程序中,我需要三种类型的用户:AdminBrokerClient。这是我们可以做到的。

class UserManager(BaseUserManager):

    def create_client(self, username, first_name, last_name, email, phone, password=None):
        user = self.model(
            username=username,
            first_name=first_name,
            last_name=last_name,
            phone=phone,
            email=self.normalize_email(email)
        )
        user.set_password(password)
        user.is_client = True
        user.save(using=self.db)
        return user

    def create_reseller(self, username, first_name, last_name, email, phone, password=None):
        user = self.create_client(username, first_name, last_name, email, phone, password)
        user.is_reseller = True
        user.save()
        return user

    def create_admin(self, username, first_name, last_name, email, phone, password=None):
        user = self.create_reseller(username, first_name, last_name, email, phone, password)
        user.is_admin = True
        user.save()
        return user


    class User(AbstractBaseUser, PermissionsMixin):
        is_superuser = None

        REQUIRED_FIELDS = ["username", "first_name", "last_name", "phone"]
        EMAIL_FIELD = "email"
        USERNAME_FIELD = 'email'

        objects = UserManager()

        email = models.EmailField(unique=True)
        username = models.CharField(max_length=DefaultModel.MAX_LENGTH)
        first_name = models.CharField(max_length=DefaultModel.MAX_LENGTH)
        last_name = models.CharField(max_length=DefaultModel.MAX_LENGTH)
        phone = PhoneNumberField(unique=True)

        is_admin = models.BooleanField(default=False)
        is_reseller = models.BooleanField(default=False)
        is_client = models.BooleanField(default=False)
        # storing timestamps for users.
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
        added_by = models.ForeignKey("self", models.CASCADE, default=None, null=True)

所以,我正在使用自定义的UserManager类,该类负责生成User模型对象,并且我已经实现了为所有类型的用户ClientBrokerAdmin生成方法。 。

DefaultModel实际上是类,我正在使用它作为常量来设置模型的默认值。这是它的样子:

class DefaultModel:
    MAX_LENGTH = 1000
    MYSQL_UNIQUE_LENGTH = 255

如果您不了解模型中的objects,则可以从Django文档中学习。Custom User ModelsDjango Managers

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