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

【Django】继承框架中用户模型基类AbstractUser扩展系统用户表字段

Django项目新建好app之后,通常情况下需要首要考虑的就是可以认为最重要的用户表,即users对应的model,它对于系统来说可以说是最基础的依赖。
实际上,我们在初始进行migration的时候已经同步生成了相应的user表,如下:
在这里插入图片描述
对应的表结构如下:
在这里插入图片描述
上述的这些字段通常都是可以保留使用的,但是为了方便扩展实际中是可以进行字段添加的,例如在users相应的app包中修改其对应的models.py文件

from django.db import models
from django.contrib.auth.models import AbstractUser

# 元组用于定义性别字段的可选值。第一个元素是存储在数据库中的值,第二个元素是显示给用户的友好名称
GENDER_CHOICES = (
    ("male", "男"),
    ("female", "女")
)

# 上述导入models模块是Django中提供的用于定义数据库模型的
# AbstractUser是Django的用户模型基类,提供了默认的用户字段和功能,比如用户名、密码、电子邮件等。这里直接继承
class UserProfile(AbstractUser):
    nick_name = models.CharField(max_length=50, verbose_name="昵称", default="")
    birthday = models.DateField(verbose_name="生日", null=True, blank=True)
    gender = models.CharField(verbose_name="性别", choices=GENDER_CHOICES, max_length=6)
    address = models.CharField(max_length=100, verbose_name="地址", default="")
    mobile = models.CharField(max_length=11, unique=True, verbose_name="手机号码")
    image = models.ImageField(verbose_name="用户头像", upload_to="head_image/%Y/%m", default="default.jpg")

    # Meta类用于定义与模型相关的元数据,这些元数据不会直接影响数据库的结构,但会影响模型的行为和在Django管理界面中的显示方式
    # verbose_name: 模型的单数名称,用于在Django管理界面显示
    # verbose_name_plural: 模型的复数名称,与单数名称相同
    class Meta:
        verbose_name = "用户信息"
        verbose_name_plural = verbose_name

    # __str__方法定义了模型实例的字符串表示。若有昵称,则返回昵称;否则返回用户名,这使得在Django管理界面中更容易识别用户
    def __str__(self):
        if self.nick_name:
            return self.nick_name
        else:
            return self.username

更新model还不够,还需要在项目中的配置文件settings.py中添加如下配置:

AUTH_USER_MODEL = "users.UserProfile"

为什么在settings.py中添加相应的配置为AUTH_USER_MODEL = "users.UserProfile"而不是AUTH_USER_MODEL = “apps.users.models.UserProfile”?

这是一种约定,用于指定自定义用户模型。AUTH_USER_MODEL 只需包含应用名和模型名,Django会根据应用的名称解析模型,而不是通过模块路径。只要确保在 INSTALLED_APPS中正确注册了users应用,Django就能找到对应的模型。

更新了用户模型之后就可以重新makemigrations和migrate了,数据库中将重新生成相应的用户表(可以在迁移之前先删除之前的表),如下:
在这里插入图片描述
在这里插入图片描述
可见添加的字段都更新进表中了。

说明:过程中如果出现报错,可以先将旧表及migrations中的相关文件都先删了然后再先makemigrations再migrate。


http://www.kler.cn/news/367084.html

相关文章:

  • 【功能安全】技术安全概念TSC
  • Linux功法之文件切割术
  • 传输层TCP
  • Mybatis-03.入门-配置SQL提示
  • GeoWebCache1.26调用ArcGIS切片
  • <项目代码>YOLOv8煤矿输送带异物识别<目标检测>
  • AMD平台,5600X+6650XT,虚拟机安装macOS 15 Sequoia 15.0.1 (2024.10)
  • Vite React 项目绝对路径配置
  • Java 项目 Dockerfile 示例:从基础镜像选择到环境变量配置的详细指南
  • 【经典论文阅读11】ESMM模型——基于贝叶斯公式的CVR预估
  • pytorch + d2l环境配置
  • 自定义类型:联合和枚举【上】
  • [实时计算flink]Flink JAR作业快速入门
  • 香橙派5(RK3588)使用npu加速yolov5推理的部署过程
  • Unsupervised Domain Adaptation in SemanticSegmentation: A Review——论文笔记
  • NSS刷题
  • Linux DEADLINE调度算法详解
  • leetcode-146. LRU 缓存
  • GPT论文整理提示词
  • 中电信翼康工程师:我在 Apache SeaTunnel 社区的贡献之旅
  • redis高级篇之IO多路复用IOMultiplexing从学术到人话版 172节答疑
  • 别名联想路径,前端项目输入@/自动出提示目录和文件
  • 使用Node.js与Express构建RESTful API
  • IntelliJ IDEA 设置数据库连接全局共享
  • ELK之路第一步——Elasticsearch集群的搭建以及踩坑记录
  • Noteexpress怎样给文献添加标签和删除标签