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

Django项目新建好app之后,通常情况下需要首要考虑的就是可以认为最重要的用户表,即users对应的model,它对于系统来说可以说是最基础的依赖。

实际上,我们在初始进行migration的时候已经同步生成了相应的user表,如下:

对应的表结构如下:

上述的这些字段通常都是可以保留使用的,但是为了方便扩展实际中是可以进行字段添加的,例如在users相应的app包中修改其对应的models.py文件

python 复制代码
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中添加如下配置:

python 复制代码
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。

相关推荐
西红柿计算机毕设4 分钟前
基于安卓Android的健康饮食系统APP(源码+文档+部署+讲解)
大数据·数据库·vue.js·spring boot·python·android-studio
很楠不爱8 分钟前
Qt——信号和槽
服务器·数据库·qt
QQ_51929232813 分钟前
【水下生物数据集】 水下生物识别 深度学习 目标检测 机器视觉 yolo(含数据集)
python·目标检测·数据集·海洋生物数据集
小龙15 分钟前
【Python爬虫实战】网络爬虫完整指南:网络协议OSI模型
爬虫·python·网络协议
蜡笔小新星26 分钟前
PyTorch的基础教程
开发语言·人工智能·pytorch·经验分享·python·深度学习·学习
疯一样的码农27 分钟前
如何选择适合自己的 Python IDE
ide·python
engchina31 分钟前
Oracle SQL Developer 同时打开多个table的设置
数据库·sql·oracle
你的月亮和太阳35 分钟前
EXPLAIN 针对性优化 SQL 查询
数据库·sql·oracle
追风少年亚索36 分钟前
[极客大挑战 2019]FinalSQL
数据库·sql
lipviolet40 分钟前
MySQL系列---sql优化
数据库·sql·mysql