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

问题描述 投票:0回答:2

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

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

或者我应该使用..

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

或者我必须制作自定义用户模型...... 这对于创建多种类型的用户很有好处...??

python django
2个回答
50
投票

Django 没有多个用户 - 它只有一个用户,然后根据权限用户可以做不同的事情。

因此,首先 - django 中只有一种用户类型。如果您使用默认的身份验证框架,则该用户的模型称为

User
,来自
django.contrib.auth.models

如果你想在 django 中自定义用户行为,你可以做三件事:

  1. 自定义身份验证方式。默认情况下,身份验证是使用存储密码的数据库完成的。您可以针对 facebook/google 等或针对您现有的用户数据库进行身份验证 - 例如,如果您位于 Windows 网络上,则使用 ActiveDirectory。

  2. 创建自定义权限,并根据这些权限,限制用户可以执行的功能。默认情况下,在每个模型上 - django 都会添加基本权限“可以编辑”,“可以删除”,“可以读取”。您可以创建自己的权限,然后检查用户是否具有这些特定权限。

  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
投票

我在 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'

另请注意,现在在引用时必须使用

settings.AUTH_USER_MODEL
您模型中关系中的新
User
模型。

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
© www.soinside.com 2019 - 2024. All rights reserved.