如何正确扩展 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 与代理的混合?
【问题讨论】:
这里确定它是一个应用程序的核心是什么? 您不应该扩展AbstractUser
或AbstractBaseUser
,因为这些是带有abstract = True
的模型吗?
我什至不知道这些课程,所以不确定。
【参考方案1】:
您现在正在做的是创建用户的子类,它是非抽象的。这意味着创建一个表,其中有一个名为user_ptr
的ForeignKey
指向auth.User
表上的主键。 但是,您通过设置AUTH_USER_MODEL
所做的也是告诉django.contrib.auth
不要创建该表,因为您将使用MyUser
。 Django 有点困惑是可以理解的:P
您需要做的是从AbstractUser
或AbstractBaseUser
继承。
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 用户模型的主要内容,如果未能解决你的问题,请参考以下文章