Django用户模型
我有一个Django应用程序,在那里我扩展了用户模型。见下文。我有一种类型的用户有3个属性-电子邮件、全名和化身。我将拥有多种类型的用户。也许老师、学生、家长、校友等等不是我的专业,而是一个例子。我是否应该在下面的用户模型中输入它们共同的字段,然后创建一个具有4个不共享属性的模型,例如,您所教的年级、在校年份、毕业年份?我是在飞行中编造的,但是你明白我用外键加入他们的意思。我正在努力扩展。我不确定相关的_名称arg是什么意思Django用户模型,django,python-3.x,web,Django,Python 3.x,Web,我有一个Django应用程序,在那里我扩展了用户模型。见下文。我有一种类型的用户有3个属性-电子邮件、全名和化身。我将拥有多种类型的用户。也许老师、学生、家长、校友等等不是我的专业,而是一个例子。我是否应该在下面的用户模型中输入它们共同的字段,然后创建一个具有4个不共享属性的模型,例如,您所教的年级、在校年份、毕业年份?我是在飞行中编造的,但是你明白我用外键加入他们的意思。我正在努力扩展。我不确定相关的_名称arg是什么意思 class Teach(AbstractBaseUser):
class Teach(AbstractBaseUser):
user = models.ForeignKey(User, related_name='teacher')
classes = models.EmailField(...)
year_started_teaching = models..
class Student(AbstractBaseUser):
user = models.ForeignKey(User, related_name='teacher')
year_graduating = models.Integer()
class User(AbstractBaseUser):
email = models.EmailField(max_length=255, unique=True)
full_name = models.CharField(max_length=255, blank=True, null=True)
avatar = models.ImageField(upload_to='images/', blank=True)
is_active = models.BooleanField(default=True) # can login
staff = models.BooleanField(default=False) # staff user non superuser
admin = models.BooleanField(default=False) # superuser
timestamp = models.DateTimeField(auto_now_add=True)
或者我应该有4个单独的模型,每个模型都有用户。在某个时刻,我会有一个我想要筛选的所有用户的列表,因此我认为有了主模型和模型
class Teach(AbstractBaseUser):
email = models.EmailField(max_length=255, unique=True)
full_name = models.CharField(max_length=255, blank=True,
classes = models.EmailField(...)
year_started_teaching = models..
class Student(AbstractBaseUser):
email = models.EmailField(max_length=255, unique=True)
full_name = models.CharField(max_length=255, blank=True)
year_graduating = models.Integer(...)
我很确定,我不应该只有一个带有标志的模型来表示用户类型。您应该只有一个从AbstractBaseUser或AbstractUser继承的用户模型。我相信在你的情况下,使用一对一关系是一个更好的选择。例如:
class Profile(AbstractBaseUser):
""" shared extra fields for all users """
email = models.EmailField(max_length=255, unique=True)
full_name = models.CharField(max_length=255, blank=True)
class Student(models.Model):
profile = models.OneToOneField(Profile,
on_delete=models.CASCADE,
)
year_graduating = models.Integer(...)
class Teacher(models.Model):
profile = models.OneToOneField(Profile,
on_delete=models.CASCADE,
)
year_started_teaching = models.Integer(...)
在settigs.py中:
AUTH_USER_MODEL = 'myapp.Profile'
正如您所看到的,AUTH_USER_模型应该是一个单一的模型,这就是为什么从AbstractBaseUser继承多个模型是个坏主意。否则,创建用户认证系统将成为一个巨大的难题。唯一的缺点是,可以同时拥有教师和学生两种类型的用户,但在我看来,这并不是什么大问题,也很容易检查
另一种选择是使用泛型关系:
但是,这将使您的代码库管理更加困难。我认为第二种选择要好得多。您可以通过M2M关系与学生和教师联系