Django 模型(Model)定义
【摘要】 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 关键字;禁止连续下划线 | esc → description |
字段类型 | 见下表 | 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
管“表长什么样”。
五、完整迁移流程
- 建库(仅一次)
CREATE DATABASE book_db CHARACTER SET utf8mb4;
- 注册 app
INSTALLED_APPS = [
'book.apps.BookConfig', # 推荐写法
]
- 生成 & 执行迁移
python manage.py makemigrations
python manage.py migrate
- 验证
python manage.py shell
>>> from book.models import BookInfo
>>> BookInfo.objects.create(name='西游记', read_count=10086)
六、常见坑速查
现象 | 原因 | 解决 |
---|---|---|
table xxx doesn't exist |
没 migrate | 执行 migrate |
CharField 漏 max_length |
必传参数缺失 | 补 max_length |
连续下划线 __ 报错 |
与查询语法冲突 | 改为单下划线 _ |
金额用 FloatField 精度丢失 |
金融场景必须用 DecimalField |
改类型 |
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)