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'

开放的东西往往也意味着更加纯净,那么这里就会有一些问题值得注意,当使用AbstractBaseUser 的时候我们需要注意的是:如果你使用了AbstractBaseUser  ,那么django自带的auth认证的所有用法将统统不能使用,你需要自己去写加密、登陆判断、存储等等一系列方法。

如果你要删库重新建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 = '应用名.表名'

觉得写得好,给个赞呗~~~~~~欢迎来搂~~

Django用户认证模块中继承AbstractUser与AbstractBaseUser重写User表的区别的更多相关文章

  1. (30)auth模块(django自带的用户认证模块)

    Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的 ...

  2. Django之auth模块用户认证模块

    一.Auth模块 1)auth模块是什么.登录后台使用的账号密码,则就是使用的auth模块创建的表 Auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站 ...

  3. Django 2.0 学习(17):Django 用户认证(auth模块)

    Django 用户认证(auth模块) 一.认证登陆 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中:如果用户存在于数据库中,然后再验证用户输入 ...

  4. [django]用户认证中只允许登陆用户访问(网页安全问题)

    当设计一个重要网页时,一般要求未从登陆界面访问的用户不能进入其他页面,那么需要如何设置呢? 如下 django中的url.py urlpatterns = [    url(r'^$', 'login ...

  5. django用户认证系统——拓展 User 模型

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  6. django用户认证系统——拓展 User 模型2

    Django 用户认证系统提供了一个内置的 User 对象,用于记录用户的用户名,密码等个人信息.对于 Django 内置的 User 模型, 仅包含以下一些主要的属性: username,即用户名 ...

  7. django用户认证系统——登录4

    用户已经能够在我们的网站注册了,注册就是为了登录,接下来我们为用户提供登录功能.和注册不同的是,Django 已经为我们写好了登录功能的全部代码,我们不必像之前处理注册流程那样费劲了.只需几分钟的简单 ...

  8. django用户认证系统——基本设置1

    网站提供登录.注册等用户认证功能是一个常见的需求.因此,Django 提供了一套功能完整的.灵活的.易于拓展的用户认证系统:django.contrib.auth.在本教程中,我将向你展示 auth ...

  9. Django 用户认证及OneToOneField

    Django 用户认证如果自己不想写 就可以用django自带的认证 首选导入模块 models.py #!/usr/bin/env python #_*_ coding:utf8 _*_ from ...

随机推荐

  1. 数值(Number,Math, 运算符)

    1.js中数字 1.数字存储 Javascript中所有数字的存储都是64位浮点数.整数也一样. 1 === 1.0 // true 2. 数字大小范围 可以表示的最大正数和最小负数 (-Math.p ...

  2. 牛客 17439:Endless Pallet

    题目传送门 算法:min-max 容斥.树上背包.NTT. 题意简述 有一棵 \(n\) 个点的树.一开始所有点都是白色,每次操作会随机选择 \(\frac{n \times (n + 1)}{2}\ ...

  3. CF1140F Extending Set of Points 【按时间分治,并查集】

    题目链接:洛谷 首先我们考虑没有撤回操作的情况,就是将每一行和每一列看做一个点(代表行的称为白点,代表列的称为黑点),每个点$(x,y)$看做一条边. Extend操作实际上就是$x_1$行与$y_1 ...

  4. windows游戏编程了解消息事件模型

    本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22309265 作者:jadeshu   邮箱: jades ...

  5. 页面的beforeunload和unload的事件应用

    博主最近遇到一个需求,需要在用户离开之前给一个提示,是否确认离开,并且用户确认离开的话,需要发出一个请求 下面直接上代码: <!DOCTYPE HTML> <html> < ...

  6. Python学习日记(十)—— 杂货铺(全局变量补充、Python参数传递、字符串格式化、迭代器、生成器)

    全局变量补充 python自己添加了些全局变量 print(vars()) """结果: {'__name__': '__main__', '__doc__': None ...

  7. ZOJ 2592 Think Positive ——(xjbg)

    做法是,先求出前缀和pre.然后枚举端点i,[i+1,n]中pre最小的找出来,减去pre[i-1]大于0,这是第一个条件:第二个条件是,从i开始的后缀和和i之前的最小的一个pre相加大于0.只要满足 ...

  8. Windows Server 2008 R2 服务器内存使用率过高几乎耗光

    系统环境: Windows Server 2008 R2 Enterprise 搭建有 web服务器(iis) 和  文件服务   问题描述: Windows Server 2008 R2系统内存耗光 ...

  9. 【原】Python基础-__init__

    #py中,有些名称前后都会加上俩个下划线,是有特殊含义的#在Py中,由这些名字组成的集合所包含的方法称为 “魔法方法”.如果在你的对象中#实现了这些方法的其中某一个,那这些方法会被py自动调用,几乎没 ...

  10. 【locust】使用locust + boomer实现对接口的压测

    背景 很早之前,考虑单机执行能力,使用locust做过公司短信网关的压测工作,后来发现了一个golang版本的locust,性能是python版本的5到10倍以上,但是一直没有机会使用. 最近公司想做 ...