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

时间:2014-09-15 06:05:06

标签: python django

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

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

或者我应该使用..

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

或者我必须制作自定义用户模型... 这对于创建多个类型的用户来说会很好...... ??

2 个答案:

答案 0 :(得分:20)

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 User model。自定义用户模型最常见的用途是,如果您想使用电子邮件地址作为用户名。

  4. 您不必全部三个,事实上有时您只想存储一些额外信息或使用他们的电子邮件地址进行身份验证;在某些应用程序中,您必须修改所有三个位置。

    在您的情况下,由于您要做的只是存储关于用户的额外信息,您需要extend the user model,通过创建引用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.
    

答案 1 :(得分:5)

我跟随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