当前位置: 首页 > news >正文

替代 Django 默认 User 模型并使用 `django-mysql` 添加数据库备注20240904

替代 Django 默认 User 模型并使用 django-mysql 添加数据库备注

前言

在 Django 项目开发中,默认的 User 模型虽然能够满足许多基础需求,但在实际项目中我们常常需要对用户模型进行定制化。通过覆盖默认的 User 模型,我们可以根据具体的业务需求添加额外的字段、修改字段属性等。同时,使用 django-mysql,我们还可以在数据库迁移时为字段添加备注,提高数据库的可读性。

本文将详细讲解如何从头开始创建一个 Django 项目,替代默认的 User 模型,并使用 django-mysql 为数据库字段添加注释。

一、项目初始化

1. 创建 Django 项目

首先,使用 django-admin 命令来创建一个新的 Django 项目:

django-admin startproject oaback
cd oaback

此命令将在当前目录下创建一个名为 oaback 的 Django 项目。oaback 目录将包含项目的基本结构。

2. 创建应用 oaauth

接下来,我们需要创建一个新的应用来管理用户认证和权限逻辑:

django-admin startapp oaauth

这个命令将在 oaback 目录下创建一个 oaauth 应用,该应用将包含用户模型及相关逻辑。

二、配置 settings.py

settings.py 中,我们需要配置已安装的应用程序,并覆盖默认的 User 模型。

1. 配置已安装的应用程序

打开 oaback/settings.py 文件,找到 INSTALLED_APPS,并添加以下配置:

INSTALLED_APPS = [# "django.contrib.admin","django.contrib.auth","django.contrib.contenttypes",# "django.contrib.sessions",# "django.contrib.messages","django.contrib.staticfiles",# 安装rest_framework"rest_framework",# 为了解决跨域问题,安装corsheaders"corsheaders","django_mysql",  # 添加 django-mysql 到已安装的应用程序中# 项目app"apps.oaauth",  # 你的用户管理应用"apps.absent"   # 其他应用
]
2. 设置自定义用户模型

为了使用自定义的用户模型,必须在 settings.py 中配置 AUTH_USER_MODEL。确保添加如下配置:

# OAUser覆盖原有的User模型
# 正确的格式app.User
AUTH_USER_MODEL = 'oaauth.OAUser'

三、定义自定义 User 模型

oaauth/models.py 文件中,定义自定义的用户模型:

from django.contrib.auth.hashers import make_password
from django.db import models
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin, BaseUserManager
from shortuuidfield import ShortUUIDField
from django_mysql.models import Modelclass UserStatusChoices(models.IntegerChoices):ACTIVED = 1, "已激活"UNACTIE = 2, "未激活"LOCKED = 3, "已锁定"class OAUserManager(BaseUserManager):use_in_migrations = Truedef _create_user(self, real_name, email, password, **extra_fields):if not real_name:raise ValueError("The given real_name must be set")email = self.normalize_email(email)user = self.model(real_name=real_name, email=email, **extra_fields)user.password = make_password(password)user.save(using=self._db)return userdef create_user(self, real_name, email=None, password=None, **extra_fields):extra_fields.setdefault("is_staff", True)extra_fields.setdefault("is_superuser", False)return self._create_user(real_name, email, password, **extra_fields)def create_superuser(self, real_name, email=None, password=None, **extra_fields):extra_fields.setdefault("is_staff", True)extra_fields.setdefault("is_superuser", True)extra_fields.setdefault("status", UserStatusChoices.ACTIVED)if extra_fields.get("is_staff") is not True:raise ValueError("Superuser must have is_staff=True.")if extra_fields.get("is_superuser") is not True:raise ValueError("Superuser must have is_superuser=True.")return self._create_user(real_name, email, password, **extra_fields)class OAUser(Model, AbstractBaseUser, PermissionsMixin):uid = ShortUUIDField(primary_key=True,verbose_name="用户ID",help_text="用户唯一标识符,使用ShortUUID生成",db_comment="用户唯一标识符,使用ShortUUID生成")password = models.CharField(max_length=128,verbose_name="密码",help_text="用户的密码,已加密存储",db_comment="用户的密码,已加密存储")last_login = models.DateTimeField(verbose_name="上次登录时间",help_text="用户上次登录的日期和时间",db_comment="用户上次登录的日期和时间",null=True,blank=True)is_superuser = models.BooleanField(verbose_name="超级用户状态",help_text="标识用户是否具有所有权限",db_comment="标识用户是否具有所有权限",default=False)real_name = models.CharField(max_length=150,verbose_name="真实姓名",help_text="用户的真实姓名,最多150个字符",db_comment="用户的真实姓名,最多150个字符")email = models.EmailField(unique=True,blank=False,verbose_name="电子邮件",help_text="用户的电子邮件地址,必须唯一",db_comment="用户的电子邮件地址,必须唯一")telephone = models.CharField(max_length=20,unique=True,blank=False,verbose_name="联系电话",help_text="用户的联系电话,必须唯一,最多20个字符",db_comment="用户的联系电话,必须唯一,最多20个字符")is_staff = models.BooleanField(default=False,verbose_name="员工状态",help_text="是否为员工身份,员工可访问管理界面",db_comment="是否为员工身份,员工可访问管理界面")status = models.IntegerField(choices=UserStatusChoices.choices,default=UserStatusChoices.UNACTIE,verbose_name="用户状态",help_text="用户的当前状态",db_comment="用户的当前状态")is_active = models.BooleanField(default=True,verbose_name="活跃状态",help_text="是否为活跃用户,影响登录权限",db_comment="是否为活跃用户,影响登录权限")date_joined = models.DateTimeField(auto_now_add=True,verbose_name="加入日期",help_text="用户加入系统的日期和时间",db_comment="用户加入系统的日期和时间")department = models.ForeignKey("OADepartment",null=True,on_delete=models.SET_NULL,related_name="staffs",related_query_name="staffs",verbose_name="所属部门",help_text="用户所属的部门,可以为空。部门被删除时,该字段设置为空",db_comment="用户所属的部门,可以为空。部门被删除时,该字段设置为空")extra_data = models.JSONField(verbose_name="额外数据",help_text="用户的额外信息,存储为JSON格式",default=dict,db_comment="用户的额外信息,存储为JSON格式")objects = OAUserManager()EMAIL_FIELD = "email"USERNAME_FIELD = "email"REQUIRED_FIELDS = ["real_name", "password"]def clean(self):super().clean()self.email = self.__class__.objects.normalize_email(self.email)def get_full_name(self):return self.real_namedef get_short_name(self):return self.real_namedef __str__(self):return f"{self.real_name} ({self.email})"def get_status_display(self):return dict(UserStatusChoices.choices).get(self.status, "Unknown")

四、应用迁移并验证结果

1. 生成并应用迁移

在完成模型定义和 settings.py 配置后,运行以下命令生成并应用数据库迁移:

python manage.py makemigrations
python manage.py migrate
2. 验证数据库中的字段备注

应用迁移后,你可以使用数据库管理工具或直接运行 SQL 查询,来验证字段备注是否已成功应用:

SHOW FULL COLUMNSFROM oaauth_oauser;

结语

通过本文的学习,你已经掌握了如何从零开始创建一个 Django 项目,并通过替代默认的 User 模型和使用 django-mysql 添加数据库字段备注来实现项目的定制化。这不仅增强了你的项目的灵活性,也提高了数据库的可读性。希望本文能为你的开发工作提供帮助,如果你在开发过程中遇到了类似的需求,记得分享你的经验!

相关文章:

替代 Django 默认 User 模型并使用 `django-mysql` 添加数据库备注20240904

替代 Django 默认 User 模型并使用 django-mysql 添加数据库备注 前言 在 Django 项目开发中,默认的 User 模型虽然能够满足许多基础需求,但在实际项目中我们常常需要对用户模型进行定制化。通过覆盖默认的 User 模型,我们可以根据具体的业…...

三维激光扫描点云配准外业棋盘的布设与棋盘坐标测量

文章目录 一、棋盘标定板准备二、棋盘标定板布设三、棋盘标定板坐标测量一、棋盘标定板准备 三维激光扫描棋盘是用来校准和校正激光扫描仪的重要工具,主要用于提高扫描精度。棋盘标定板通常具有以下特点: 高对比度图案:通常是黑白相间的棋盘格,便于识别。已知尺寸:每个格…...

【Python知识宝库】文件操作:读写文件的最佳实践

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 文章目录 前言一、文件读取1. 使用open函数2. 逐行读取3. 使用readlines和readline 二、文件写入1. 写入文本2. 追加内容3. 写入…...

Chapter 13 普通组件的注册使用

欢迎大家订阅【Vue2Vue3】入门到实践 专栏,开启你的 Vue 学习之旅! 文章目录 前言一、组件创建二、局部注册三、全局注册 前言 在 Vue.js 中,组件是构建应用程序的基本单元。本章详细讲解了注册和使用 Vue 的普通组件的两种方式:…...

u盘显示需要格式化才能用预警下的数据拯救恢复指南

U盘困境:需要格式化的紧急应对 在数字信息爆炸的时代,U盘作为便携的数据存储介质,承载着我们工作、学习乃至生活中的大量重要资料。然而,当U盘突然弹出“需要格式化才能用”的提示时,这份便捷瞬间转化为焦虑与不安。这…...

还不懂BIO,NIO,AIO吗

BIO(Blocking I/O)、NIO(Non-blocking I/O)和 AIO(Asynchronous I/O)是 Java 中三种不同的 I/O 模型,主要用于处理输入 / 输出操作。 一、BIO(Blocking I/O) 定义与工作原…...

物联网——DMA+AD多通道

DMA简介 存储器映像 某些数据在运行时不会发生变化,则设置为常量,存在Flash存储器中,节省运行内存的空间 DMA结构图 DMA访问权限高于cpu 结构要素 软件触发源:存储器到存储器传输完成后,计数器清零 硬件触发源&…...

Vue 中 watch 和 watchEffect 的区别

watch 和 watcheffect 都是 vue 中用于监视响应式数据的 api,它们的区别在于:watch 用于监视特定响应式属性并执行回调函数。watcheffect 用于更通用的响应式数据监视,但回调函数中不能更新响应式数据。Vue 中 watch 和 watchEffect 的区别 …...

pip install pyaudio sounddevice error: externally-managed-environment

shgbitaishgbitai-C9X299-PGF:~/pythonworkspace/ai-accompany$ pip install pyaudio sounddevice error: externally-managed-environment This environment is externally managed ╰─> To install Python packages system-wide, try apt installpython3-xyz, where xyz …...

HTML 转 PDF API 接口

HTML 转 PDF API 接口 网络工具 / 文件处理 支持网页转 PDF 高效生成 PDF / 提供永久链接。 1. 产品功能 超高性能转换效率;支持将传递的 HTML 转换为 PDF,支持转换 HTML 中的 CSS 格式;支持传递网站 URL,直接转换页面成对应的 …...

http://localhost:15672/ 无法访问

注意erlang版本和rabbitmq的版本要保持兼容 rabbitmq和erlang对应关系如下:https://www.rabbitmq.com/which-erlang.html 目前我选择的erlang版本是:otp_win64_24.3.3,rabbit版本是:rabbitmq-server-3.10.18.exe 如果两者之间的版…...

6.3图的遍历

图的遍历是指从某点出发,按照某种搜索方式沿着边访问图中所有节点 图的遍历算法主要有两种:广度优先,深度优先 都需要辅助数组visited[]来记录节点是否被访问过 6.3.1广度优先搜索 like层次遍历,需要辅助队列 代码实现 #include<stdio.h> #define maxnum 15 bool vi…...

2024数学建模国赛选题建议+团队助攻资料(已更新完毕)

目录 一、题目特点和选题建议 二、模型选择 1、评价模型 2、预测模型 3、分类模型 4、优化模型 5、统计分析模型 三、white学长团队助攻资料 1、助攻代码 2、成品论文PDF版 3、成品论文word版 9月5日晚18&#xff1a;00就要公布题目了&#xff0c;根据历年竞赛题目…...

大学课程-人机交互期末复习

绪论 什么是人机交互技术&#xff1f;⭐⭐ 是指关于设计、评价和实现供人们使用的交互式计算机系统&#xff0c;并围绕相关的主要现象进行研究的学。狭 义的讲&#xff0c;人机交互技术主要是研究人与计算机之间的信息交换&#xff0c;它主要包括人到计算机和计算机到人的 信息…...

畅游5G高速网络:联发科集成Wi-Fi6E与蓝牙5.2的系统级单芯片MT7922

这周末,除非外面下钞票,否则谁也拦不住我玩《黑神话悟空》(附:两款可以玩转悟空的显卡推荐) IPBrain平台君 集成电路大数据平台 2024年09月03日 17:28 北京 联发科一直以创新技术追赶市场需求…… “不努力向前游就会被海浪拍回岸边…” 芯片设计公司产品层出不穷,想要站…...

SpringSecurity原理解析(一)

一、SpringSecurity 核心组件 在SpringSecurity中的jar包有4个&#xff0c;作用分别为&#xff1a; spring-security-coreSpringSecurity的核心jar包&#xff0c;认证和授权的核心代码都在这里面spring-security-config如果使用Spring Security XML名称空间进行配置或Spring S…...

在Ubuntu 20.04上安装Nginx的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 Nginx 是世界上最流行的 Web 服务器之一&#xff0c;负责托管互联网上一些最大和流量最高的网站。它是一个轻量级选择&#xff0c…...

基于苹果Vision Pro的AI NeRF方案:MetalSplatter

随着苹果Vision Pro的发布,混合现实(Mixed Reality, MR)技术迎来了一个新的发展阶段。为了充分利用Vision Pro的潜力,一款名为MetalSplatter的Swift/Metal库应运而生,它允许开发者在Vision Pro上以全立体的方式体验捕捉内容。本文将详细介绍MetalSplatter的特点及其如何为…...

linux系统中,计算两个文件的相对路径

realpath --relative-to/home/itheima/smartnic/smartinc/blocks/ruby/seanet_diamond/tb/parser/test_parser_top /home/itheima/smartnic/smartinc/corundum/fpga/lib/eth/lib/axis/rtl/axis_fifo.v 检验方式就是直接在当前路径下&#xff0c;把输出的路径复制一份&#xff0…...

[数据集][目标检测]抽烟检测数据集VOC+YOLO格式22559张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;22559 标注数量(xml文件个数)&#xff1a;22559 标注数量(txt文件个数)&#xff1a;22559 标…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...