文章目录

    • 一、模型字段类型详解
      • Django 与 MySQL 字段类型映射
      • 整数类型深度对比
    • 二、常用字段选项
      • null 与 blank 的区别
      • 注释与帮助文本
      • 默认值设置
      • 日期时间特殊选项
      • 选项列表(choices)
    • 三、模型元数据与方法
      • 模型 Meta 类
      • 模型管理器(Manager)
      • 自定义模型方法
    • 四、模型继承
      • 抽象基类
      • 模型继承实战


一、模型字段类型详解

在 Django 开发中,模型(Model)是连接应用程序与数据库的核心桥梁。

Django 与 MySQL 字段类型映射

Django 模型的每个字段都是特定 Field 类的实例,它决定了数据库存储类型和表单验证规则。

Django 字段类型MySQL 数据类型说明
CharFieldVARCHAR字符串类型,需指定 max_length
TextFieldTEXT长文本类型
IntegerFieldINT整数类型
BigIntegerFieldBIGINT长整数类型
BooleanFieldTINYINT(1)布尔类型(0=False,1=True)
DateTimeFieldDATETIME日期时间类型
SmallIntegerFieldSMALLINT小整数类型

整数类型深度对比

TINYINTSMALLINT是两种常用的整数类型,选择合适的类型能优化存储效率

维度TINYINTSMALLINT
存储空间1 字节(8 位)2 字节(16 位)
有符号范围-128 到 127-32768 到 32767
无符号范围0 到 2550 到 65535
适用场景布尔值、状态标记、年龄、枚举值等小范围数值用户积分、订单数量等中等范围数值
示例年龄(0-120)、月份(1-12)、星期(1-7)用户积分(0-5000)、订单数量(0-30000)

二、常用字段选项

字段选项用于配置字段的行为特性,以下是开发中最常用的选项

null 与 blank 的区别

# null影响数据库存储,blank影响表单验证
field1 = models.CharField(max_length=100, null=True)  # 数据库可存NULL
field2 = models.CharField(max_length=100, blank=True)  # 表单可提交空值
field3 = models.CharField(max_length=100, null=True, blank=True)  # 两者皆可
  • null=True:允许数据库存储 NULL 值(默认 False)
  • blank=True:允许表单提交空值(默认 False)
  • 注意:前端提交""空字符串时,若blank=False会触发验证错误

注释与帮助文本

class Book(models.Model):title = models.CharField(max_length=100,help_text='Enter the book title',  # 表单帮助文本db_comment="图书标题"  # 数据库字段注释(Django4.2+))class Meta:db_table_comment = 'This table stores information about books.'  # 数据库表注释
  • help_text:表单帮助文本
  • db_comment: 数据库字段注释

默认值设置

# 固定默认值
count = models.IntegerField(default=0)# 可调用对象作为默认值
from datetime import date
birth_date = models.DateField(default=date.today)
  • default : 该字段的默认值

日期时间特殊选项

class BaseModel(models.Model):# 首次创建时自动设置当前时间created_at = models.DateTimeField(auto_now_add=True)# 每次save()时自动更新为当前时间updated_at = models.DateTimeField(auto_now=True)

注意:

  • auto_now在QuerySet.update()时不会自动生效,需手动更新或使用save()
  • auto_now_add、auto_now 和 default 选项相互排斥,这些选项的任何组合都会导致报错
class Article(models.Model):def save(self, *args, **kwargs):if not self.pk:  # 仅在首次创建时设置self.created_at = timezone.now()self.updated_at = timezone.now()super().save(*args, **kwargs)
  • 当需要复杂时间逻辑时,覆盖模型的 save() 方法

选项列表(choices)

使用choices定义字段的可选值范围

# 直接定义选项
class Person(models.Model):SHIRT_SIZES = [("S", "Small"),("M", "Medium"),("L", "Large"),]shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)# 枚举类定义选项(推荐)
from enum import Enum
class UserTypeEnum(Enum):MEMBER = 1  # 会员ADMIN = 2   # 管理员class User(models.Model):user_type = models.SmallIntegerField(choices=[(item.value, item.name) for item in UserTypeEnum],default=UserTypeEnum.MEMBER.value)

三、模型元数据与方法

模型 Meta 类

通过内部Meta类定义模型的元数据,即 “非字段信息”

class User(models.Model):username = models.CharField(max_length=50)email = models.EmailField()class Meta:db_table = "system_users"  # 数据库表名db_table_comment = "用户信息表"  # 数据库表注释ordering = ['-id']  # 默认排序verbose_name = "用户"  # 单数显示名verbose_name_plural = "用户"  # 复数显示名

managed=False适用于:

  • 与遗留数据库集成时
  • 不希望 Django 自动修改表结构的场景

模型管理器(Manager)

Manager 是模型与数据库交互的接口,默认名为objects。 模型管理器只能通过模型类来访问,一般用于“表级”操作

# 表级操作
all_users = User.objects.all()
active_users = User.objects.filter(is_active=True)
user = User.objects.get(id=1)

自定义模型方法

模型方法用于实现 “行级” 操作,可自定义业务逻辑

  • 重写 save() 方法:例如实现保存前后的处理
  • 重写 delete() 方法:例如实现软删除
  • 其它自定义方法:例如编写原生 SQL 语句
class Blog(models.Model):name = models.CharField(max_length=100)tagline = models.TextField()def save(self, *args, **kwargs):# 保存前处理self.name = self.name.title()super().save(*args, **kwargs)  # 调用父类方法# 保存后操作self.clear_cache()def clear_cache(self):"""自定义缓存清理方法"""cache.delete(f"blog_{self.id}")

注意:重写的模型方法不会在批量操作(例如update())中调用

四、模型继承

抽象基类

将公共字段提取到抽象基类,避免代码重复

class CommonInfo(models.Model):"""抽象基类:包含公共字段"""name = models.CharField(max_length=100)age = models.PositiveIntegerField()created_at = models.DateTimeField(auto_now_add=True)class Meta:abstract = True  # 标记为抽象类,不生成数据表# 继承抽象基类
class Student(CommonInfo):home_group = models.CharField(max_length=5)# 自动拥有name, age, created_at字段class Teacher(CommonInfo):department = models.CharField(max_length=50)# 自动拥有name, age, created_at字段

模型继承实战

实战场景:在一个Django+Vue 后台管理系统中,需要维护多个数据表。这些数据表中,一般需要记录创建者、创建时间、更新者和更新时间等信息。可将该部分公共字段提取到抽象基类,避免代码重复。

定义抽象基类BaseModel

from django.db import modelsclass BaseModel(models.Model):creator = models.CharField(max_length=64, blank=True, null=True, default="", db_comment="创建者")create_time = models.DateTimeField(auto_now_add=True, db_comment="创建时间")updater = models.CharField(max_length=64, blank=True, null=True, default="", db_comment="更新者")update_time = models.DateTimeField(auto_now=True, db_comment="更新时间")class Meta:abstract = True

继承抽象基类:点击查看完整代码

在这里插入图片描述

实现效果

在这里插入图片描述


您正在阅读的是《Django从入门到实战》专栏!关注不迷路~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/91046.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91046.shtml
英文地址,请注明出处:http://en.pswp.cn/web/91046.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

墨者:SQL注入实战-MySQL

1. 墨者学院:SQL注入实战-MySQL🚀 2. 实训重点目标✨ 目标一: 了解sqlmap的使用及其tamper插件的使用; 目标二: 了解base64编码及解码。 3. 解题方向🔍 目标网站的id参数通过Base64编码传输,…

Milvus 实战全流程

📚 学习路径总览1. Milvus 基础知识什么是向量数据库?Milvus 的核心概念(collection、field、index、partition、segment)Milvus 和 Faiss、Annoy、HNSW 的区别2. 安装与部署Docker 快速部署 Milvus(推荐)本…

Mysql数据库基础(入门)

目录 一.认识Sql 1.什么是Sql 2.Sql的作用 3.Sql通用语法 4.Sql分类 二.数据库的操作(DDL) 1.创建数据库 2.显示/使用数据库 3.修改数据库 4.删除数据库 三.常用数据类型 1.数值类型 2.字符串类型 3.日期类型 4.详细的数据类型 四.表的操…

MySQL 锁机制 15 连问 · 面试速答版

一、脑图:锁全景(先记结构,再填细节) 锁层级 ├─ 表锁 │ ├─ 意向锁 IS / IX │ └─ 表锁 READ / WRITE └─ 行锁├─ 记录锁 Record├─ 间隙锁 Gap└─ 临键锁 Next-Key二、15 问 15 答(面试官一问一…

【Linux】发展历程

很高兴为您详细介绍Linux操作系统的详细发展历程。Linux是一个自由和开放源代码的操作系统内核,由林纳斯托瓦兹(Linus Torvalds)于1991年首次发布。以下是Linux操作系统的主要发展里程碑:1. Linux 0.01 (1991)发布日期&#xff1a…

LNMP架构+wordpress实现动静分离

WordPress简称WP,最初是一款博客系统,后逐步演化成一款免费的CMS(内容管理系统/建站系统)。 WordPress网站的适用场景: 博客 企业官网 作品集网站 电商平台 线上教育系统 论坛和社群网站 甚至会员系统、订阅内容…

智慧灯杆:不止于照明,塔能科技的城市感知网络野心

当夜幕悄然降临,城市里的路灯便依次亮了起来,它们可不单单照亮了行人前行的路以及车辆行驶的道路,实际上还在悄无声息地经历着一场变革。现如今的路灯,早已不再仅仅充当单纯的照明工具这么一个角色了,而是逐渐转变成了…

【Linux内核模块】调试技巧

内核模块开发最让人头疼的不是写代码,而是调试 —— 代码编译通过了,加载后却要么没反应,要么直接让系统崩溃。这就像在黑屋子里修机器,看不见摸不着。其实内核调试有一套成熟的工具箱,掌握这些工具和技巧,…

RK3568笔记九十一:QT环境搭建

若该文为原创文章,转载请注明原文出处。 记录按照正点原子给的手册搭建QT环境 参考《09【正点原子】ATK-DLRK3568_Qt开发环境搭建V1.2.pdf》 一、安装 1、下载 https://mirrors.sau.edu.cn/qt/archive/online_installers/4.6/qt-unified-linux-x64-4.6.0-online.run 2、赋…

面试实战,问题十六,Java面试,消息队列,如何避免消息重复消费,怎么回答

在Java面试中,关于消息队列如何防止消息被重复消费的问题,可以从以下几个方面进行回答,结合系统架构设计、消息队列机制和业务逻辑处理,确保在不同场景下实现消息的幂等性。 1. 消息队列重复消费的根本原因 消息重复消费的根本原因…

PDF转图片实用指南:如何批量高效转换?

将PDF转换为图片后,可以更方便地在演示文稿、网页或电子相册中使用这些资料,以便更好地展示信息。它 是一款支持多文件批量转换的工具,可将多个 PDF 文档一键转换为图片格式。虽然界面为英文,但操作简单,不影响使用。你…

走入Linux的世界:编辑器Vim

嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…

PyTorch中神经网络的模型构建

要构建自定义模型,需完成两个核心步骤:继承 nn.Module 类;重载 __init__ 方法(初始化)和 forward 方法(前向计算) 神经网络的构造 初始化方法(__init__) def __init__…

QML QtCharts坐标轴系统

QtCharts是Qt框架中强大的数据可视化模块,它提供了丰富的图表类型和灵活的坐标轴系统,能够满足各种数据展示需求。本文将全面介绍QML中QtCharts的坐标轴系统,包括数值坐标轴(ValueAxis)、对数坐标轴(LogValueAxis)、分类坐标轴(CategoryAxis)…

TI 2025全国电赛猜题

本科组可能的题目方向本科组器材更侧重高频信号处理、复杂控制系统、精密测量及多设备协同,可能涉及以下题目:四旋翼飞行器相关任务题目示例:设计 “基于四旋翼的 UV 光控自主导航系统”任务要求:利用四旋翼飞行器(最大…

Python自动化运维实战指南

什么是自动化运维定义与背景自动化运维是指利用工具和脚本自动执行传统上需要人工操作的IT运维任务,包括但不限于服务器配置管理、软件部署、监控告警、日志分析等日常工作。随着互联网业务规模的扩大,传统手工运维方式已无法满足快速部署、规模化管理等…

k8s的csi对接GPFS

在 Kubernetes(k8s)集群中,通过 CSI(Container Storage Interface)对接 GPFS(General Parallel File System,现为 IBM Spectrum Scale)是实现高性能共享存储的重要方案。GPFS 作为并…

HTB赛季8靶场 - era

nmap扫描 └─$ nmap -p- --min-rate 1000 -T4 10.129.137.201 -oA nmapfullscan Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-07-27 21:19 EDT Warning: 10.129.137.201 giving up on port because retransmission cap hit (6). …

Bug猫学习史#1:面向对象

在Java编程中,掌握几个核心概念对深入学习至关重要:类属性建议采用包装类以提升灵活性;建造者模式中this关键字能有效简化对象构建过程;static关键字涉及类的加载机制;接口默认使用public修饰符并支持默认方法实现&…

优测推出HarmonyOS全场景测试服务,解锁分布式场景应用卓越品质!

随着HarmonyOS NEXT“纯血鸿蒙”的全面商用,生态正以前所未有的速度重构终端操作系统格局。对于APP厂商而言,应用测试需要从单一设备思维向场景化服务验证转变。优测云服务平台正式推出 HarmonyOS全场景测试解决方案,针对鸿蒙系统提供功能测试…