Django 作为一个成熟的 Web 框架,其本身就自带一套 User 模型。具体的源码位置在 django.contrib.auth.models 文件中的 class User(AbstractUser)。如果我们深入探究源码,就会发现 User 类的继承路径如下:
在 Django 自带的用户模型,已经封装好了很多常用功能,例如 User 模型里面的变量有 username, first_name, last_name, email, is_staff, is_active, date_joined, objects 等;还有一些常用的方法,只不过 Django 将这些方法都封装到了 AbstractUser 的父类 AbstractBaseUser 中,这些方法有 save(), get_username(), set_password(), check_password(), set_unusable_password(), get_email_field_name(), get_session_auth_hash() 等。至于这些变量和方法是干什么用的,你可以很直观的从它们的名字上面得到结果。
Django 框架有个最厉害的地方就是它的 ORM 框架。ORM 是 Object Relational Mapping 的缩写,翻译过来是 关系对象映射。其作用是根据代码会自动生成数据库表格,并且会根据 Django 对接的数据库引擎,将所有关于数据库操作的代码翻译成对应的 sql 语句,这样就使得 Django 的开发者无需关心程序底层使用的是哪一款数据库,应该怎么配置对接等等,只需要将开发精力放到业务逻辑即可。
User 模型里的 ORM
在 AbstractUser 类的源码中,有一个 objects = UserManager()。 没错,这个 objects 就是我们上面提到的 ORM 。一般的 ORM 操作,比如要寻找 id 为 1888 的用户,代码如下
user = User.objects.get(id="1888")
这里 get() 方法返回的是一个 QuerySet 类,这个当然是 Django ORM 的另一个大特色:懒加载。只有当 QuerySet 在 迭代, 切片操作, 调用 len() 函数, 调用 list() 函数进行转化 和 条件判断 的时候, QuerySet 才会被翻译成 SQL 语句执行。
其次,我们可以看到, User 模型里的 ORM 主要是通过调用其内部的 objects 变量的方法,也就是 UserManager 的方法来实现的。如果我们追踪 UserManager 源码就会发现,它的整个继承路径如下:
在 UserManager 类中,可以看到有这些方法 create_user(), create_superuser() 。 在其父类 BaseUserManager 中,可以看到有 normalize_email() 方法,用来规范输入的邮件地址。
所以,在分析完 Django User 源码之后,我们可以得出结论:如果要实现自定义 Django 用户系统,那么首先得创建一个类,这个类必须继承 AbstractBaseUser 和 PermissionsMixin 类。同时,还得实现自定义的 UserManager,这个 UserManager 需要继承自 BaseUserManager 类。
标签:get,UserManager,用户,ORM,User,模块,Django,源码 From: https://www.cnblogs.com/lazarus235/p/17052659.html