我是Django的新手,只有2周的时间,并且遇到了需要帮助的情况。
这是一种核心概念,由于我缺乏知识,我向您致歉。
我已经用多个角色扩展了下面的基本用户模型。现在,每个角色对其个人资料都有不同的要求。
我需要帮助以了解如何进一步扩展Students
或Staff
。我需要扩展两种情况。
两者都可以具有不同的扩展模型,例如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])
在此先感谢您的帮助。
答案 0 :(得分:1)
想象一下您的Users
为People
和People
随时间变化的现实世界。就像今天我是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是一个很好的例子。