找回密码
 立即注册
首页 业界区 业界 Django模型开发:模型字段、元数据与继承全方位讲解 ...

Django模型开发:模型字段、元数据与继承全方位讲解

事值 2025-7-29 09:49:41
一、模型字段类型详解

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

Django 模型的每个字段都是特定 Field 类的实例,它决定了数据库存储类型和表单验证规则。
Django 字段类型MySQL 数据类型说明CharFieldVARCHAR字符串类型,需指定 max_lengthTextFieldTEXT长文本类型IntegerFieldINT整数类型BigIntegerFieldBIGINT长整数类型BooleanFieldTINYINT(1)布尔类型(0=False,1=True)DateTimeFieldDATETIME日期时间类型SmallIntegerFieldSMALLINT小整数类型整数类型深度对比

TINYINT和SMALLINT是两种常用的整数类型,选择合适的类型能优化存储效率
维度TINYINTSMALLINT存储空间1 字节(8 位)2 字节(16 位)有符号范围-128 到 127-32768 到 32767无符号范围0 到 2550 到 65535适用场景布尔值、状态标记、年龄、枚举值等小范围数值用户积分、订单数量等中等范围数值示例年龄(0-120)、月份(1-12)、星期(1-7)用户积分(0-5000)、订单数量(0-30000)二、常用字段选项

字段选项用于配置字段的行为特性,以下是开发中最常用的选项
null 与 blank 的区别
  1. # null影响数据库存储,blank影响表单验证
  2. field1 = models.CharField(max_length=100, null=True)  # 数据库可存NULL
  3. field2 = models.CharField(max_length=100, blank=True)  # 表单可提交空值
  4. field3 = models.CharField(max_length=100, null=True, blank=True)  # 两者皆可
复制代码

  • null=True:允许数据库存储 NULL 值(默认 False)
  • blank=True:允许表单提交空值(默认 False)
  • 注意:前端提交""空字符串时,若blank=False会触发验证错误
注释与帮助文本
  1. class Book(models.Model):
  2.     title = models.CharField(
  3.         max_length=100,
  4.         help_text='Enter the book title',  # 表单帮助文本
  5.         db_comment="图书标题"  # 数据库字段注释(Django4.2+)
  6.     )
  7.    
  8.     class Meta:
  9.         db_table_comment = 'This table stores information about books.'  # 数据库表注释
复制代码

  • help_text:表单帮助文本
  • db_comment: 数据库字段注释
默认值设置
  1. # 固定默认值
  2. count = models.IntegerField(default=0)
  3. # 可调用对象作为默认值
  4. from datetime import date
  5. birth_date = models.DateField(default=date.today)
复制代码

  • default : 该字段的默认值
日期时间特殊选项
  1. class BaseModel(models.Model):
  2.     # 首次创建时自动设置当前时间
  3.     created_at = models.DateTimeField(auto_now_add=True)
  4.     # 每次save()时自动更新为当前时间
  5.     updated_at = models.DateTimeField(auto_now=True)
复制代码
注意:

  • auto_now在QuerySet.update()时不会自动生效,需手动更新或使用save()
  • auto_now_add、auto_now 和 default 选项相互排斥,这些选项的任何组合都会导致报错
  1. class Article(models.Model):
  2.     def save(self, *args, **kwargs):
  3.         if not self.pk:  # 仅在首次创建时设置
  4.             self.created_at = timezone.now()
  5.         self.updated_at = timezone.now()
  6.         super().save(*args, **kwargs)
复制代码

  • 当需要复杂时间逻辑时,覆盖模型的 save() 方法
选项列表(choices)

使用choices定义字段的可选值范围
  1. # 直接定义选项
  2. class Person(models.Model):
  3.     SHIRT_SIZES = [
  4.         ("S", "Small"),
  5.         ("M", "Medium"),
  6.         ("L", "Large"),
  7.     ]
  8.     shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)
  9. # 枚举类定义选项(推荐)
  10. from enum import Enum
  11. class UserTypeEnum(Enum):
  12.     MEMBER = 1  # 会员
  13.     ADMIN = 2   # 管理员
  14. class User(models.Model):
  15.     user_type = models.SmallIntegerField(
  16.         choices=[(item.value, item.name) for item in UserTypeEnum],
  17.         default=UserTypeEnum.MEMBER.value
  18.     )
复制代码
三、模型元数据与方法

模型 Meta 类

通过内部Meta类定义模型的元数据,即 "非字段信息"
  1. class User(models.Model):
  2.     username = models.CharField(max_length=50)
  3.     email = models.EmailField()
  4.    
  5.     class Meta:
  6.         db_table = "system_users"  # 数据库表名
  7.         db_table_comment = "用户信息表"  # 数据库表注释
  8.         ordering = ['-id']  # 默认排序
  9.         verbose_name = "用户"  # 单数显示名
  10.         verbose_name_plural = "用户"  # 复数显示名
复制代码
managed=False适用于:

  • 与遗留数据库集成时
  • 不希望 Django 自动修改表结构的场景
模型管理器(Manager)

Manager 是模型与数据库交互的接口,默认名为objects。 模型管理器只能通过模型类来访问,一般用于“表级”操作
  1. # 表级操作
  2. all_users = User.objects.all()
  3. active_users = User.objects.filter(is_active=True)
  4. user = User.objects.get(id=1)
复制代码
自定义模型方法

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

  • 重写 save() 方法:例如实现保存前后的处理
  • 重写 delete() 方法:例如实现软删除
  • 其它自定义方法:例如编写原生 SQL 语句
  1. class Blog(models.Model):
  2.     name = models.CharField(max_length=100)
  3.     tagline = models.TextField()
  4.    
  5.     def save(self, *args, **kwargs):
  6.         # 保存前处理
  7.         self.name = self.name.title()
  8.         super().save(*args, **kwargs)  # 调用父类方法
  9.         # 保存后操作
  10.         self.clear_cache()
  11.    
  12.     def clear_cache(self):
  13.         """自定义缓存清理方法"""
  14.         cache.delete(f"blog_{self.id}")
复制代码
注意:重写的模型方法不会在批量操作(例如update())中调用
四、模型继承

抽象基类

将公共字段提取到抽象基类,避免代码重复
  1. class CommonInfo(models.Model):
  2.     """抽象基类:包含公共字段"""
  3.     name = models.CharField(max_length=100)
  4.     age = models.PositiveIntegerField()
  5.     created_at = models.DateTimeField(auto_now_add=True)
  6.    
  7.     class Meta:
  8.         abstract = True  # 标记为抽象类,不生成数据表
  9. # 继承抽象基类
  10. class Student(CommonInfo):
  11.     home_group = models.CharField(max_length=5)
  12.     # 自动拥有name, age, created_at字段
  13. class Teacher(CommonInfo):
  14.     department = models.CharField(max_length=50)
  15.     # 自动拥有name, age, created_at字段
复制代码
模型继承实战

实战场景:在一个Django+Vue 后台管理系统中,需要维护多个数据表。这些数据表中,一般需要记录创建者、创建时间、更新者和更新时间等信息。可将该部分公共字段提取到抽象基类,避免代码重复。
定义抽象基类BaseModel
  1. from django.db import models
  2. class BaseModel(models.Model):
  3.     creator = models.CharField(
  4.         max_length=64, blank=True, null=True, default="", db_comment="创建者"
  5.     )
  6.     create_time = models.DateTimeField(auto_now_add=True, db_comment="创建时间")
  7.     updater = models.CharField(
  8.         max_length=64, blank=True, null=True, default="", db_comment="更新者"
  9.     )
  10.     update_time = models.DateTimeField(auto_now=True, db_comment="更新时间")
  11.     class Meta:
  12.         abstract = True
复制代码
继承抽象基类:点击查看完整代码
1.png

实现效果
2.png

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

来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除

相关推荐

您需要登录后才可以回帖 登录 | 立即注册