Django创建多种类型用户的最佳方法

34

我想在Django中创建多个用户。我想知道哪种方法最好。

class Teachers(models.Model):
    user = models.ForeignKey(User)
    is_teacher = models.BooleanField(default=True)
    .......

还是我应该使用...

class Teacher(User):
    is_teacher = models.BooleanField(default=True)
    .......

我是否需要创建自定义用户模型,这样可以创建多种类型的用户?


3
当模型本身被称为“教师”时,拥有一个名为“is_teacher”的字段有点毫无意义,对吧?如果您的模型被称为“用户”,然后您想为每种用户类型设置标志,那么这将是有意义的,但在您发布的代码中,它有点多余。 - Burhan Khalid
2个回答

50
Django没有多个用户 - 它只有一个用户,基于权限,用户可以做不同的事情。
因此,首先 - 在django中只有一种用户类型。如果使用默认的身份验证框架,则此用户的模型称为“User”,来自“django.contrib.auth.models”。
如果您想在django中自定义用户行为,则有三件事情可以做:
  1. 自定义身份验证方式。默认情况下,使用存储密码的数据库进行身份验证。您可以针对 Facebook/Google 等进行身份验证,或者针对现有用户数据库进行身份验证 - 例如,如果您在 Windows 网络上,则可以使用 ActiveDirectory 进行身份验证。

  2. 创建自定义权限,并基于这些权限限制用户可以执行的功能。默认情况下,在每个模型上 - Django 将添加基本权限 "can edit"、"can delete"、"can read"。您可以创建自己的权限,然后检查用户是否具有这些特定权限。

  3. 您可以存储有关用户的额外信息,以及 Django 通常存储的任何内容。根据您需要的自定义程度,有两种方法可以实现。如果默认情况下 Django 提供的所有内容都适用于您,并且您只想存储有关用户的额外信息,则可以 扩展用户模型 - 在以前的版本中,这称为创建自定义配置文件。另一个选项是 创建自己的 User 模型,如果您需要更深入的自定义。自定义用户模型最常见的用途是将电子邮件地址用作用户名。

您不必全部完成这三个步骤,有时您只想存储一些额外的信息或使用电子邮件地址进行身份验证;在某些应用程序中,您必须修改这三个位置。在您的情况下,由于您只想存储有关用户的额外信息,因此您需要通过创建一个引用User模型的模型扩展用户模型(注意:您不会从User继承):
class Profile(models.Model):
    user = models.OneToOneField(User)
    department = models.CharField(max_length=200, default='Computer Science')
    is_teacher = models.BooleanField(default=False)
    is_student = models.BooleanField(default=True)
    # .. etc. etc.

8
如果我想为老师和学生提供不同的领域,我想为老师和学生创建不同的模型,并使用不同的字段。只有一些字段是共同的,他们应该使用不同的注册表单进行注册,一个是给老师用,另一个是给学生用。 - gamer
4
你不需要创建不同的模型,只需创建一个模型,然后在用来注册用户的表单中,只显示与他们相关的字段。不要创建多个模型来代表你的用户,这会在之后产生问题。 - Burhan Khalid
好的,我会做同样的事情。但是我正在尝试使用不同的模型来创建自定义用户模型。如果它不起作用,我会采用你的想法。 - gamer
好的,非常精准的回答,谢谢! - Tuhin Mitra

8

我曾经使用Django 1.7(也适用于1.6)的一种方法是通过子类化AbstractUser来实现。

from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    balance = models.DecimalField(default=0.0, decimal_places=2, max_digits=5)

为了使用您的模型,您需要在settings.py中将其设置为用于身份验证的模型:
AUTH_USER_MODEL = 'your_app.User'

需要注意的是在模型中引用新的 User 模型关系时,你现在必须使用 settings.AUTH_USER_MODEL

from django.db import models
from django.conf import settings

class Transaction(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL) # ForeignKey(User) will not work

如何从交易中返回余额... def unicode(self): return self.user.balance ?? - gamer
就像任何ForeignKey关系一样。 - Nils Werner
尼尔斯,为什么你使用了这个方法,而不是扩展用户模型? - Erika
@Nils的方法是一个不错的选择。它可以在视图级别上对用户权限进行细粒度控制。 - AwsAnurag

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接