Django-使用多角色用户和多种需求类型扩展模型

时间:2020-02-03 23:08:45

标签: django django-models

我是Django的新手,只有2周的时间,并且遇到了需要帮助的情况。 这是一种核心概念,由于我缺乏知识,我向您致歉。 我已经用多个角色扩展了下面的基本用户模型。现在,每个角色对其个人资料都有不同的要求。 我需要帮助以了解如何进一步扩展StudentsStaff。我需要扩展两种情况。

  1. 两者都可以具有类似的扩展模型,例如下面的地址。
  2. 两者都可以具有不同的扩展模型,例如Students具有CurrentCourse,而Staff没有。 Staff具有Salary模型,而Students没有模型。

    class User(AbstractUser):
       is_student = models.BooleanField(default=True)
       is_staff = models.BooleanField(default=True)
    
    
    class Student(models.Model):
       user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
       dob = models.CharField(max_length=30, blank=True)
       location = models.CharField(max_length=30, blank=True)
    
    
    class CurrentCourse(models.Model):
       student = models.OneToOneField(Student,
                                   on_delete=model.CASCADE)
        ....
    
    
    class Staff(models.Model):
        ROLES = (('Teacher', 'Teacher'), ('Professor', 'Professor'), ('Administration', 'Administration'))
        user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
        role = models.CharField(max_length=100, choices=ROLES)
        website = models.CharField(max_length=100, blank=True)
    

这两种类型的用户都可以有多个地址,而学生和教职员工都需要地址,不确定如何使用ForeignKey进行扩展。

   class Address(models.Model):
       user = ?
   street = models.CharField(max_length=200)
   city = models.CharField(max_length=50)
   country = models.CharField(max_length=50)

  class Salary(models.Model):
   staff = models.OneToOneField(Staff, on_delete=models.CASCADE)
   current_salary = models.DecimalField(max_digits=10, decimal_places=2)

最后请让我知道如何在每个模型上应用验证器,例如,我对所有模型(而不是学生或员工)进行了“用户”子类化。如何在OneToOneField上应用验证器,如下所示?我以为,如果我应用像这样的验证器:

staff_validator(value):

我无法在验证函数中调用用户,并且不确定它将是全局的还是在使用缩进的模型中。

class Salary(models.Model):
        staff = models.OneToOneField(User, on_delete=models.CASCADE, validators=[staff_validator])

在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

想象一下您的UsersPeoplePeople随时间变化的现实世界。就像今天我是Student一样,我属于“ People”类别,如果明天我将是Professor,则我仍然属于People类别。

因此People可以戴上不同的帽子或扮演不同的角色,但他们仍然是People。同样,您的User模型将始终是您需要在数据库中定义的所有角色的一部分。因此,您不仅需要扩展User模型,而且实际上还需要扩展您认为User可以属于其中的模型的所有角色,并且应该像下面这样:

class User(AbstractUser):
     is_student = models.BooleanField(default=False)
     is_teacher = models.BooleanField(default=False)
     .....

class Student(models.Model):
     user =  models.OneToOneField(User, on_delete=models.CASCADE, related_name='foo')
     .....

class Courses(models.Model):
     user = models.ManyToMany(User)

您需要参考三种类型的模型的官方文档。 Abstract个模型,Proxy个模型和Inherited个模型可以更清楚地说明。同样,为了为应用程序创建视图,您还可以使用decorators为用户创建检查。根据您的问题,Here是一个很好的例子。