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

2024-04-25 20:04:36 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

或者我应该用。。

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

或者我必须定制用户模型。。。 哪个对创建多类型用户有好处。。。??


Tags: django方法用户truedefaultmodelismodels
2条回答

我在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 你的新模型中的关系。

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

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

所以,首先-django中只有一个用户类型。如果使用默认身份验证框架,则此用户的模型称为User,来自django.contrib.auth.models

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

  1. Customize how you authenticate them。默认情况下,身份验证是使用存储密码的数据库完成的。您可以针对facebook/google等进行身份验证,也可以针对您现有的用户数据库进行身份验证—例如,如果您在Windows网络上,则可以使用ActiveDirectory进行身份验证。

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

  3. 您可以存储有关用户的额外信息,以及django通常存储的任何信息。有两种方法可以做到这一点,这取决于您需要多少定制。如果django在默认情况下提供的所有功能都对您有效,您所要做的就是存储有关用户的额外信息,您可以extend the user model-在以前的版本中,这称为创建自定义配置文件。另一个选择是create your own ^{} model,如果您想要更深入的定制。自定义用户模型最常见的用法是,如果要使用电子邮件地址作为用户名。

你不必做这三件事,事实上,有时候你只需要存储一些额外的信息,或者让他们使用他们的电子邮件地址进行身份验证;在一些应用程序中,你必须修改这三个位置。

在您的例子中,由于您只想存储有关用户的额外信息,因此需要通过创建引用User的模型来extend the user model(注意:您不是从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.

相关问题 更多 >