在Django中扩展AbstractUser的正确方法?

时间:2016-09-19 05:50:04

标签: python mysql django authorization django-authentication

我正在尝试集成两个django应用程序,每个应用程序都有各自的auths工作。要做到这一点,我试图继承AbstractUser而不是User。我正在关注PyBB docsDjango#substituting_custom_model。除了各自的 init .py(包括从我的站点包中的PyBB库中迁移)之外,我删除了所有应用程序中的所有迁移文件。我还将Mysql数据库更改为空白,重新开始,我正在尝试将AbstractUser子类化,如下所示。

我的Models.py:

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

from django.db import models
class Student_User(models.Model):
    """
    Table to store accounts
    """
    su_student = models.OneToOneField(AbstractUser)

    USERNAME_FIELD = 'su_student'

    su_type = models.PositiveSmallIntegerField(db_column='su_type', default=0)
    su_access = models.TextField(db_column='su_access', default='')
    su_packs = models.TextField(db_column='su_packs', default='')

    REQUIRED_FIELDS = []

    def __unicode__(self):
        return str(self.su_student)

我的settings.py:

AUTH_USER_MODEL = "app.Student_User"
PYBB_PROFILE_RELATED_NAME = 'pybb_profile'

为我的主应用程序运行makemigrations时,出现此错误:

app.Student_User.su_student: (fields.E300) Field defines a relation with model 'AbstractUser', which is either not installed, or is abstract.

我如何实现我想在这里做的事情?

PS:该应用程序在没有username_field或required_field的用户的情况下正常运行。

PPS:我刚刚在contrib.auth.models中检查了AbstractUser模型,它有class Meta: abstract = True。好吧,它的摘要,仍然,我该如何解决这个问题?我只需要一次登录,目前,我的网站的两个部分,虽然通过网址连接,要求单独登录,不要检测彼此登录。我需要做些什么?

1 个答案:

答案 0 :(得分:2)

你不能与抽象模型建立一对一的关系;根据定义,抽象模型永远不会实际实例化。

AbstractUser应该是继承的。你的结构应该是:

class Student_User(AbstractUser):
    ...