Django 模型(Model)
1. 模型简介
ORM 简介
MVC 框架中一个重要的部分就是 ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库。即直接面向对象操作数据,无需考虑 sql 语句。
ORM 是“对象-关系-映射”的简称,主要任务是:
- 根据对象的类型生成表结构。
- 将对象(或对象列表)的操作,转换为 sql 语句。
- 将 sql 查询到的结果转换为对象(或对象列表)。
这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动。
Django 中的模型包含了存储数据的字段和约束,对应着数据库中唯一的表。
使用 Mysql 数据库的环境配置
创建数据库
create databases modeldemo charset=utf8
打开应用的 settings.py 文件,修改 DATABASES 项:
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'modeldemo', # 使用的Mysql库名'USER': '用户名','PASSWORD': '密码','HOST': '数据库服务器ip,本地可以使用localhost','PORT': '端口,默认为3306',}
}
安装 python mysql API
python3
pip install pymysql
且要在项目的 __init__.py 中添加:
import pymysql
pymysql.version_info = (1, 4, 13, "final", 0) # 指定版本。在出现“mysqlclient 1.4.0 or newer is required; you have 0.9.3.”报错时加上此行
pymysql.install_as_MySQLdb()
否则会出现报错:Error loading MySQLdb module: No module named 'MySQLdb'。
python2(已废弃,基本不用,可以不考虑)
pip install MySQL-python
且不需要在 __init__.py 中添加上述代码。
开发流程
- 在 models.py 中定义模型类,要求继承自 models.Model。
- 把应用加入 settings.py 文件的 installed_app 项。
- 迁移:生成迁移文件;执行迁移并生成表(迁移的目的是映射模型类与表。如果模型类与表的映射关系已存在,则无需迁移)。
- 使用模型类进行 crud(增删改查)操作。
2. 定义模型
在模型中定义属性,会生成表中的字段。
Django 根据属性的类型确定以下信息:
- 当前选择的数据库支持字段的类型(核心)。
- 渲染管理站点表单时使用的默认 html 控件。
- 在管理站点最低限度的验证。
Django 会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后,则 Django 不会再生成默认的主键列。
属性命名限制:
- 不能是 python 的保留关键字。
- 由于 Django 的查询方式,不允许带有连续的下划线。
1)定义属性
定义属性时,需要明确字段类型。字段类型被定义在 django.db.models.fields 目录下,为了方便使用,被导入到了 django.db.models 中。
使用方式:
from django.db import models
通过 models.Field 创建字段类型的对象,赋值给属性。如:
title = models.CharField(max_length=20)
若想对重要数据都做逻辑删除而不做物理删除,实现方法是定义 isDelete 属性,类型为 BooleanField,默认值为 False。
2)字段类型
- AutoField:一个根据实际 id 自动增长的 IntegerField,通常不指定。
- 如果不指定,一个主键字段将自动添加到模型中。
- BooleanField:true/false 字段,此字段的默认表单控制是 CheckboxInput。
- NullBooleanField:支持 null、true、false 三种值。
- CharField(max_length=最大字符长度):字符串,默认的表单样式是 TextInput。
- TextField:大文本字段,一般超过 4000 字符时使用,默认的表单控件是 Textarea。
- IntegerField:整数。
- DecimalField(max_digits=None, decimal_places=None):使用 python 的 Decimal 实例表示的十进制浮点数。
- DecimalField.max_digits:位数总数。
- DecimalField.decimal_places:小数点后的数字位数。
- FloatField:用 python 的 float 实例来表示的浮点数。
- DateField[auto_now=False, auto_now_add=False]):使用 python 的 datetime.date 实例表示的日期。
- 参数 DateField.auto_now:每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为 false。
- 参数 DateField.auto_now_add:当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为 false。
- 该字段默认对应的表单控件是一个 TextInput. 在管理员站点添加了一个 JavaScript 写的日历控件,和一个“Today"的快捷按钮,包含了一个额外的 invalid_date 错误消息键。
- auto_now_add, auto_now, and default 这些设置是相互排斥的,他们之间的任何组合将会发生错误的结果。
- TimeField:使用 python 的 datetime.time 实例表示的时间,参数同 DateField。
- DateTimeField:使用 python 的 datetime.datetime 实例表示的日期和时间,参数同 DateField。
- FileField:一个上传文件的字段。
- ImageField:继承了 FileField 的所有属性和方法,但对上传的对象进行校验,确保它是个有效的 image。
3)字段选项
通过字段选项,可以实现对字段的约束。实现方式是通过字段对象的关键字参数指定。
- null:如果为 True,Django 将空值以 NULL 存储到数据库中,默认值是 False。
- blank:如果为 True,则该字段允许为空白,默认值是 False。
- 对比:null 是数据库范畴的概念,blank 是表单验证证范畴的。
- db_column:字段的名