如何正确扩展Django用户模型?

3

我正在尝试通过扩展用户模型并编写自己的身份验证后端来增加默认Django身份验证模型的字段和功能。

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)

这是一段非常基础的代码,但在尝试同步数据库时,我遇到了一个奇怪的错误,谷歌上也没有相关信息:

CommandError: 一个或多个模型未通过验证: core.sldcuser: 'user_ptr' 定义了与模型 'auth.User' 的关联,该模型已被替换。请更新关联以指向 settings.AUTH_USER_MODEL。

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

AUTH_USER_MODEL = 'core.MyUser'

有人遇到过这个错误吗?

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


这里的核心是什么,确切地说它是一个应用程序吗? - drabo2005
你应该继承AbstractUser或者AbstractBaseUser,因为它们是带有abstract = True属性的模型,不是吗? - SunnySydeUp
我甚至不知道那些类,所以不确定。 - mike_hornbeck
1个回答

8
你现在正在创建一个名为User的非抽象子类。这意味着创建了一个表,其中有一个名为user_ptr的ForeignKey指向auth.User表上的主键。然而,通过设置AUTH_USER_MODEL,你还告诉django.contrib.auth不要创建该表,因为你将使用MyUser。Django可能会有点困惑:P
相反,你需要继承AbstractUser或AbstractBaseUser之一。
- 如果你想要User已经拥有的所有内容,并且只想添加更多字段,请使用AbstractUser。 - 如果你想要从干净的状态开始,并且仅继承User上的通用函数但实现自己的字段,请使用AbstractBaseUser。
参考资料:

谢谢。上次我使用Django是几年前的事了,我想那时还没有这些抽象模型。 - mike_hornbeck
1
抽象模型自至少版本1.0以来就存在。虽然我很高兴这能对你有所帮助。祝你好运:D - Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接