AbstractUser 和 AbstractBaseUser 看起来十分相似, 如果你不熟悉 djiango 的 auth 重写 User, 那你很容易弄错, 导致一堆 bug.
我们查看 AbstractUser 的源码得知, AbstractUser 继承了 AbstractBaseUser, 讲得俗气一点就是, AbstractBaseUser 是 AbstractUser 的爸爸.
我们可以猜想一下, 既然二者是继承与被继承关系, 那么 AbstractUser 是不是在 AbstractBaseUser 的基础上功能更加完善呢? AbstractBaseUser 是不是更加 open 呢?
通过官方文档我们可以得到答案:
AbstractUser
The documentation explains this fully. AbstractUser is a full User model, complete with fields, as an abstract class so that you can inherit from it and add your own profile fields and methods. AbstractBaseUser only contains the authentication functionality, but no actual fields: you have to supply them when you subclass.
文档充分解释了这一点. AbstractUser 是一个完整的用户模型, 包含字段, 作为一个抽象类, 以便您可以继承它并添加您自己的配置文件字段和方法. AbstractBaseUser 仅包含身份验证功能, 但不包含实际字段: 当您继承子类时, 您必须提供它们.
The AbstractUser is basically just the "User" class you're probably already used to. AbstractBaseUser makes fewer assumptions and you have to tell it what field represents the username, what fields are required, and how to manage those users.
AbstractUser 基本上就是您可能已经习惯的 "用户" 类. AbstractBaseUser 的继承较少, 您必须告诉它哪个字段代表用户名, 需要哪些字段以及如何管理这些用户.
- AbstractBaseUser
- If you're just adding things to the existing user (i.e. profile data with extra fields), then use AbstractUser because it's simpler and easier. If you want to rethink some of Django's assumptions about authentication, then AbstractBaseUser gives you the power to do so.
如果您只是将事情添加到现有用户 (即具有额外字段的配置文件数据), 则使用 AbstractUser 是因为它更简单, 更简单. 如果您想重新考虑一下 Django 关于认证的假设, 那么 AbstractBaseUser 会为您提供这样的权力.
什么意思呢? 就是说啊, 我们习惯的继承 的 AbstractUser 类是高度集成的, 里面给你定义了一堆的字段, 不需要你人为去定义了.
上面是我们需要额外添加的, 下面是 django 帮你额外做的 (没有显示完全, 右边还有自己添加的部分字段)
但回过头来想, 高度集成的东西往往扩展性和兼容性就较差, 万一哪天一个项目来了说我只需要基本的用户名密码, 用户类型等等三四个字段, 其他的都不 care, 那么很显然这时候用 AbstractUser 是不合理的, 将造成数据库资源的浪费, 降低数据库效率.
这时候我们就可以来继承 AbstractBaseUser 类来自定义一些字段. 下面我们来看看 AbstractBaseUser 的用法
model
创建后的所有表字段
由此可见, django 只帮我们额外创建了 id,password,last_login 这三个字段.
在模型类中我们必须定义一个用户名字段, 并指定属性为 unique, 然后告诉 django 这个字段是用户名字段:
- username = models.CharField(max_length=32,unique=True)
- USERNAME_FIELD = 'username'
- # 这当中的 username 你可以任意命名, unique 必须指定为 True
如果不写这两句话, 你会发现执行数据库迁移命令怎么创建表都没办法创建出来, 一直报错:
AttributeError: type object 'UserInfo' has no attribute 'USERNAME_FIELD'
如果你要删库重新建 model, 请到你的 App 下面的 migrations 文件夹下面把除__init__.py 的其他文件全部删除, 再执行数据库迁移命令.
顺带把数据库迁移命令语句丢在这儿:
第一种方式: PyCharm 的 Terminal 命令行:
第一条: python manage.py makemigrations 或者 python3 manage.py makemigrations ### 根据你配置的 python 环境而定
第二条: python manage.py migrate 或者 python3 manage.py migrate
第二种方式: PyCharm 上菜单栏 Tools --> run manage.py Task...
第一条: makemigrations
第二条: migrate
此外自定义 User 表, 如果希望 django 只生成我们自己定义的 User 表, 不生成 django 自带的 auth_user 表, 你需要导 setting 里加一行代码:
AUTH_USER_MODEL = '应用名. 表名'
觉得写得好, 给个赞呗~~~~~~ 欢迎来搂~~
来源: https://www.cnblogs.com/dongxixi/p/11047087.html