【问题标题】:Django user modelDjango 用户模型
【发布时间】:2018-09-29 10:36:58
【问题描述】:

我有一个 Django 应用程序,我在其中扩展了用户模型。 (见下文)。我有一种类型的用户,它有 3 个属性 - 电子邮件、全名和头像。我将拥有多种类型的用户。也许是老师、学生、家长、校友等(不是我的领域,而是一个例子)。我是否应该将它们共同的字段放在用户模型下面,然后创建一个具有 4 个不共享属性的模型(例如,您教的年级,或在校的年份,毕业的年份?我正在编造这个在飞行中,但你明白我的意思)用外键加入他们。我正在尝试扩展 this page 。我不确定related_name 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(...)

我很确定我不应该只有一个带有标志的模型来表示用户类型。

【问题讨论】:

  • 我认为第二种选择要好得多。您可以通过M2M 关系与学生和老师联系

标签: django python-3.x web


【解决方案1】:

您应该只有一个从 AbstractBaseUser 或 AbstractUser 继承的用户模型。我相信在您的情况下,使用 OneToOne 关系是一个更好的选择。例如:

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_MODEL - 应该是单个模型,这就是为什么从 AbstractBaseUser 继承多个模型是个坏主意。否则创建用户认证系统将成为一个令人头疼的问题。唯一的缺点 - 可能有两种类型的用户 - 教师和学生,但在我看来,这没什么大不了的,而且很容易检查。

另一种选择是使用通用关系:

https://docs.djangoproject.com/en/2.0/ref/contrib/contenttypes/#generic-relations

但这会让你的代码库更难管理。

【讨论】:

    猜你喜欢
    • 2012-01-03
    • 2014-03-04
    • 2019-06-07
    • 1970-01-01
    • 2013-05-28
    • 2018-03-07
    • 2016-10-12
    • 2011-02-28
    • 2013-12-06
    相关资源
    最近更新 更多