如何正确扩展 django 用户模型

Posted

技术标签:

【中文标题】如何正确扩展 django 用户模型【英文标题】:How to properly extend django User model 【发布时间】:2013-12-23 07:35:06 【问题描述】:

我正在尝试使用其他字段和功能扩展默认 Django 的身份验证模型,因此我决定只扩展 User 模型并编写自己的身份验证后端。

from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.contrib.auth.models import User


class MyUser(User):
    access_key = models.CharField(_('Acces Key'), max_length=64)

这确实是一个基本代码,但在尝试同步数据库时,我遇到了一个 Google 不知道的奇怪错误:

CommandError: One or more models did not validate: core.sldcuser: 'user_ptr' defines a relation with the model 'auth.User', which has been swapped out. Update the relation to point at settings.AUTH_USER_MODEL.

在我的 settings.py 中,我添加了我认为需要的内容:

AUTH_USER_MODEL = 'core.MyUser'

有没有人偶然发现这个错误?

或者我应该使用一对一的方式,或者 1t1 与代理的混合?

【问题讨论】:

这里确定它是一个应用程序的核心是什么? 您不应该扩展AbstractUserAbstractBaseUser,因为这些是带有abstract = True 的模型吗? 我什至不知道这些课程,所以不确定。 【参考方案1】:

您现在正在做的是创建用户的子类,它是非抽象的。这意味着创建一个表,其中有一个名为user_ptrForeignKey 指向auth.User 表上的主键。 但是,您通过设置AUTH_USER_MODEL 所做的也是告诉django.contrib.auth 不要创建该表,因为您将使用MyUser。 Django 有点困惑是可以理解的:P

您需要做的是从AbstractUserAbstractBaseUser 继承。

如果您想要用户已有的所有内容,并且只想添加更多字段,请使用 AbstractUser 如果您想从一个干净的状态开始,并且只继承 User 上的通用函数,但实现您自己的字段,请使用 AbstractBaseUser

参考:

https://docs.djangoproject.com/en/dev/topics/auth/customizing/#extending-the-existing-user-model https://docs.djangoproject.com/en/dev/topics/auth/customizing/#substituting-a-custom-user-model

【讨论】:

谢谢。几年前我上次使用 Django 时,我猜没有那些抽象模型之类的东西 抽象模型自 at least 1.0 以来一直存在。不过,我很高兴这对您有所帮助。快乐狩猎:D

以上是关于如何正确扩展 django 用户模型的主要内容,如果未能解决你的问题,请参考以下文章

扩展 Django 1.11 用户模型

如何正确地为 Django 的用户模型添加权限?

多对多或一对多 Django

18_django的用户模型和扩展django的用户模型

如何在mongodb中扩展django的默认用户?

在 Django 中扩展用户对象:用户模型继承还是使用 UserProfile?