Django 模型(Model)定义

举报
周杰伦本人 发表于 2025/07/30 14:23:54 2025/07/30
【摘要】 Django 模型(Model)定义完全指南一句话定位:在 Django 中,一个 Python 类 = 一张数据库表,一个类属性 = 一个表字段。我们之前简单了解了 一下Python的orm,今天再来详细看看。 一、模型类骨架from django.db import modelsclass BookInfo(models.Model): # 系统会自动添加 id = models...

Django 模型(Model)定义完全指南

一句话定位:在 Django 中,一个 Python 类 = 一张数据库表,一个类属性 = 一个表字段。我们之前简单了解了 一下Python的orm,今天再来详细看看。


一、模型类骨架

from django.db import models

class BookInfo(models.Model):
    # 系统会自动添加 id = models.AutoField(primary_key=True)
    name        = models.CharField(max_length=20, unique=True)
    pub_date    = models.DateField(null=True, blank=True)
    read_count  = models.IntegerField(default=0)
    comment_cnt = models.IntegerField(default=0)
    is_deleted  = models.BooleanField(default=False)

    class Meta:
        db_table = 'tb_book'      # 真实表名
        verbose_name = '书籍'     # admin 后台显示名

这是Python中一个类的定义,下面我会详细解释一下

系统自动添加id主键

二、字段三要素

要素 说明 示例
属性名 对应数据库列名;避免 Python / MySQL 关键字;禁止连续下划线 escdescription
字段类型 见下表 CharField, IntegerField
字段选项 控制列约束 max_length, `def

常用字段类型对照表

场景 Django 类型 MySQL 类型 备注
短字符串 CharField VARCHAR 必须给 max_length
长文本 TextField LONGTEXT 不限制长度
整数 IntegerField / SmallIntegerField / BigIntegerField INT 按大小选
小数 DecimalField(max_digits=8, decimal_places=2) DECIMAL 金额专用
日期 DateField DATE 不含时分秒
日期时间 DateTimeField DATETIME 含时分秒
布尔 BooleanField TINYINT(1) True/False
自增主键 AutoField INT AUTO_INCREMENT 系统默认已加

三、常用字段选项

选项 作用 示例
max_length=20 字符串最大长度 CharField 必写
default=0 默认值 数字 / 布尔常用
unique=True 唯一约束 用户名、ISBN
null=True 数据库允许 NULL 一般配合 blank=True
blank=True 表单允许空值 admin / ModelForm 生效
verbose_name='书名' admin 列名中文 可国际化

四、Meta 内部类

Meta 内部类写在模型类里面,用来告诉 Django:“这个表在数据库里到底叫什么名字、在后台怎么显示、默认按什么排序……”等等与字段无关的“元信息”。

class BookInfo(models.Model):
    ...
    class Meta:
        db_table = 'tb_book'           # 真实表名
        verbose_name = '书籍'
        verbose_name_plural = verbose_name
配置项 作用
db_table 指定数据库里的真实表名(默认是 app名_类名 小写)
verbose_name 后台管理界面左侧菜单的中文名称
ordering 默认排序字段
indexes 给表加联合索引
abstract = True 把当前类声明为“抽象基类”,不建表
  • 不写 db_table 时,默认表名:app名_类名 全小写,如 book_bookinfo

  • verbose_name 只影响后台显示,不影响数据库。

也就是说 模型字段管“列长什么样”,Meta 管“表长什么样”。


五、完整迁移流程

  1. 建库(仅一次)
CREATE DATABASE book_db CHARACTER SET utf8mb4;
  1. 注册 app
INSTALLED_APPS = [
  'book.apps.BookConfig',  # 推荐写法
]
  1. 生成 & 执行迁移
python manage.py makemigrations
python manage.py migrate
  1. 验证
python manage.py shell
>>> from book.models import BookInfo
>>> BookInfo.objects.create(name='西游记', read_count=10086)

六、常见坑速查

现象 原因 解决
table xxx doesn't exist 没 migrate 执行 migrate
CharFieldmax_length 必传参数缺失 max_length
连续下划线 __ 报错 与查询语法冲突 改为单下划线 _
金额用 FloatField 精度丢失 金融场景必须用 DecimalField 改类型
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。