【问题标题】:Correct way to extend AbstractUser in Django?在 Django 中扩展 AbstractUser 的正确方法?
【发布时间】:2016-09-19 05:50:04
【问题描述】:

我正在尝试集成两个 django 应用程序,每个应用程序都有各自的身份验证工作。为此,我试图继承 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)

我的设置.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 的用户的 onetoone 下正常工作。

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

【问题讨论】:

    标签: python mysql django authorization django-authentication


    【解决方案1】:

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

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

    class Student_User(AbstractUser):
        ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2021-12-13
      • 1970-01-01
      • 2022-01-08
      • 2020-04-14
      • 2011-05-28
      • 2012-05-28
      相关资源
      最近更新 更多