【问题标题】:Django - Extending models with multi role users and multiple requirement typesDjango - 扩展具有多角色用户和多种需求类型的模型
【发布时间】:2020-02-03 23:08:45
【问题描述】:

我刚接触 Django 两周,我被困在需要帮助的场景中。 这是一种核心概念,我为我缺乏知识提前道歉。 我已经用多个角色扩展了下面的基本用户模型。现在,每个角色对其个人资料都有不同的要求。 我需要帮助来了解如何进一步扩展StudentsStaff。有两种情况我需要扩展它们。

  1. 两者都可以有类似的扩展模型,如下面的地址。
  2. 两者都可以有不同的扩展模型,例如StudentsCurrentCourseStaff 没有。 StaffSalary 模型,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])

提前感谢您为此提供的帮助。

【问题讨论】:

    标签: django django-models


    【解决方案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 是一个很好的例子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-30
      • 2019-12-21
      • 2021-02-24
      • 2011-01-20
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多