当前位置: 首页 > 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运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解

突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 ​安全措施依赖问题​ GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

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

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

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

JDK 17 新特性

#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持&#xff0c;不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的&#xff…...