一、模型字段类型详解

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

Django 与 MySQL 字段类型映射

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

Django 字段类型 MySQL 数据类型 说明
CharField VARCHAR 字符串类型,需指定 max_length
TextField TEXT 长文本类型
IntegerField INT 整数类型
BigIntegerField BIGINT 长整数类型
BooleanField TINYINT(1) 布尔类型(0=False,1=True)
DateTimeField DATETIME 日期时间类型
SmallIntegerField SMALLINT 小整数类型

整数类型深度对比

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

维度 TINYINT SMALLINT
存储空间 1 字节(8 位) 2 字节(16 位)
有符号范围 -128 到 127 -32768 到 32767
无符号范围 0 到 255 0 到 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 models

class 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从入门到实战》专栏!关注不迷路~

Django模型开发:模型字段、元数据与继承全方位讲解的更多相关文章

  1. 信贷风控模型开发----模型流程&好坏样本定义

    第二章 模型开发流程&好坏样本定义 2.1模型开发流程 2.1.1 评分模型流程图 2.1.2流程图阐述 该小结提出了一些数据指标,如果不明白没有关系,往后的文章笔者会一个个地解释这些指标的含 ...

  2. Django ORM (一) 创建数据库和模型常用的字段类型参数及Field 重要参数介绍

    创建一个 Django 项目及应用 django-admin startproject orm cd orm python manage.py startapp app01 在 models.py 上 ...

  3. django中模型详解-字段类型与约束条件

    这片博文来详细说明django模型的使用,涉及到django模型的创建,字段介绍,以及django模型的crud操作,以及一对一等操作. 在使用模型之前,我们首先设置数据库选项,django的默认数据 ...

  4. SNF快速开发平台2019-权限管理模型-记录级-字段级权限实践

    1.1.1  字段级权限 字段级权限适用于对不同人的能否查看或录入不同表不同字段的权限控制. 是否启用字段级权限配置 不启用字段级权限后,[用户权限管理]程序[字段级权限]按钮会隐藏,导致无法给管理其 ...

  5. 如何让django模型中的字段和model名显示为中文

    如何让django模型中的字段和model名显示为中文:在模型中加入class Meta即可 class People(models.Model): name = models.CharField(n ...

  6. odoo 开发入门教程系列-模型和基本字段

    模型和基本字段 在上一章的末尾,我们创建一个odoo模块.然而,此时它仍然是一个空壳,不允许我们存储任何数据.在我们的房地产模块中,我们希望将与房地产相关的信息(名称(name).描述(descrip ...

  7. PHPCMS V9二次开发]自定义字段模型-文本组

    phpcms v9,我们在做类似于酒店房型等类型的时候,需要用到文本组字段模型,但phpcms并未提供该模型.如下图所示效果: 展示效果如下: 步骤/方法 打开phpcms\modules\conte ...

  8. [PHPCMS V9二次开发]自定义字段模型-添加字段类型

    步骤/方法 打开phpcms\modules\content\fields目录,复制文件夹downfiles,并改名为textgroups. 打开phpcms\modules\content\fiel ...

  9. python django -2 ORM模型

    ORM简介 MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库 ORM是“对象-关系-映射”的简称 ...

  10. Django框架3——模型

    Django数据库层解决的问题 在本例的视图中,使用了pymysql 类库来连接 MySQL 数据库,取回一些记录,将它们提供给模板以显示一个网页: from django.shortcuts imp ...

随机推荐

  1. QuickSort之C#实现

    /// <summary> /// 快速排序中的切分 /// lIndex已经是基准值,i记录基准值的大小值的边界,j记录目前遍历的边界: /// i值必须从lIndex+1开始,因为基准 ...

  2. Python内置数据结构操作VS sqlite3操作

    1.摘要 在同一数据库中查询某值,内置数据结构的查询速度快还是数据库sqlite3的查询速度快?针对这一问题,通过构建一个包含2500个随机数的列表,并将其插入sqlite3数据库中,利用timeit ...

  3. .NET 的全新低延时高吞吐自适应 GC - Satori GC

    GC 的 STW 问题 GC,垃圾回收器,本质上是一种能够自动管理自己分配的内存的生命周期的内存分配器.这种方法被大多数流行编程语言采用,然而当你使用垃圾回收器时,你会失去对应用程序如何管理内存的控制 ...

  4. 基于FPGA的超声波雷达感应预警系统 全过程记录

    FPGA系统开发 综合实验记录 实验时间节点与想法记录 2023.4.24 新建本文档.目前决定有以下两个方案,要根据学校发的器件和自己的水平和后面时间决定. 课设想法 具体情况 基于FPGA的高速运 ...

  5. React-native之Flexbox

    本文总结: 我们学到了 React Native 的 Flexbox 布局,它让写样式变得更方便啦! Flexbox 就像一个有弹性的盒子,有主轴和交叉轴(行或列). 在 RN 里写样式要用 Styl ...

  6. 手把手教你网络爬虫(爬取豆瓣电影top250,附带源代码)

    概念 网络爬虫就是按照一定的规则,自动抓取互联网信息的程序或脚本.其本质就是模拟浏览器打开网页,获取网页中我们需要的数据. 基本流程 准备工作(构建流程) 获取数据 解析内容 保存数据 1. 准备工作 ...

  7. linux系统qcow2镜像的制作

    一.简单说明 PS: 最近有客户需要在云平台上部署我们的产品,好久没有做过qcow2镜像了,这里还是把制作流程记录下来. QCOW2镜像格式是Qemu支持的磁盘镜像格式之一.它可以使用一个文件来表示一 ...

  8. Java源码分析系列笔记-6.ReentrantLock

    目录 1. 是什么 1.1. synchronized vs ReentranLock 2. 实现原理 2.1. uml图 3. 公平锁 3.1. 如何使用 3.2. 原理分析 3.2.1. 构造方法 ...

  9. [原创]《C#高级GDI+实战:从零开发一个流程图》第05章:有锯齿?拖动闪烁?优化!优化!

    一.前言 前面的课程我们实现了矩形.圆形的拖动,以及不同形状间的连线,在实现的过程中,很多读者都发现并提出来了存在显示质量差有锯齿.拖动不流畅还闪烁等问题,作为承上启下的一节课程,我们本节就来看一上如 ...

  10. java开发超级简单技巧

    JAVA EE Java Platform,Enterprise Edition---java平台企业版 java SE Java Platform,Standard Edition---java平台 ...