Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django用户模型_Django_Python 3.x_Web - Fatal编程技术网

Django用户模型

Django用户模型,django,python-3.x,web,Django,Python 3.x,Web,我有一个Django应用程序,在那里我扩展了用户模型。见下文。我有一种类型的用户有3个属性-电子邮件、全名和化身。我将拥有多种类型的用户。也许老师、学生、家长、校友等等不是我的专业,而是一个例子。我是否应该在下面的用户模型中输入它们共同的字段,然后创建一个具有4个不共享属性的模型,例如,您所教的年级、在校年份、毕业年份?我是在飞行中编造的,但是你明白我用外键加入他们的意思。我正在努力扩展。我不确定相关的_名称arg是什么意思 class Teach(AbstractBaseUser):

我有一个Django应用程序,在那里我扩展了用户模型。见下文。我有一种类型的用户有3个属性-电子邮件、全名和化身。我将拥有多种类型的用户。也许老师、学生、家长、校友等等不是我的专业,而是一个例子。我是否应该在下面的用户模型中输入它们共同的字段,然后创建一个具有4个不共享属性的模型,例如,您所教的年级、在校年份、毕业年份?我是在飞行中编造的,但是你明白我用外键加入他们的意思。我正在努力扩展。我不确定相关的_名称arg是什么意思

    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关系与学生和教师联系