ORM回顾
ORM(Object-Relation Mapping),对象-关系映射,对于开发人员主要带来了如下好处:
- 实现了数据模型与数据库的解耦,通过简单的配置就可以轻松更换数据库,而不需要修改代码。
- 只需要面向对象编程,不需要面向数据库编写代码。
- 在MVT中Model中定义的类,通过ORM与关系型数据库中的表对应,对象的属性体现对象间的关系,这种关系也被映射到数据表中。
Django框架中ORM示意图如下:
模型创建步骤回顾
- 在models.py中定义模型类
- 生成迁移文件
- 执行迁移
定义属性
语法格式:
属性 = models.字段类型(选项)
属性命名限制:
- 不能是python的保留关键字
- 不允许使用连续的下划线
- 定义属性时需要指定字段类型,通过字段类型的参数指定选项
说明:
- Django会为表创建自动增长的主键列,每个模型类只能有一个主键列
- 如果在数据库中设置了主键,Django将不会创建主键列
- 默认创建的主键列属性为id,可以使用pk代替,pk表示primary key。
- pk是主键的别名,若主键名为id2,那么pk是id2的别名。
字段类型
使用时需要引入
django.db.models
包,字段类型如下:
数据类型 | 说明 |
---|---|
AutoField | 自动增长的IntegerField,通常不用指定 不指定时Django会自动创建属性名为id的自动增长属性。 |
BooleanField | 布尔字段,值为True或False。 |
NullBooleanField | 支持Null、True、False三种值。 |
CharField | 字符串 CharField (max_length=字符长度) max_length 表示最大字符个数 |
TextField | 大文本字段,一般超过4000个字符时使用。 |
IntegerField | 整数 |
DecimalField | 十进制浮点数 DecimalField (max_digits=None, decimal_places=None) max_digits 表示总位数,decimal_places 表示小数位数 |
FloatField | 浮点数 |
DateField | 日期 DateField [auto_now=False, auto_now_add=False]) auto_now 每次保存对象时,自动设置该字段为当前时间auto_now_add 当对象第一次被创建时自动设置当前时间auto_now_add 和auto_now 互斥,组合将会发生错误。 |
TimeField | 时间,参数同DateField |
DateTimeField | 日期时间,参数同DateField |
FileField | 上传文件字段 |
ImageField | 继承于FileField,对上传的内容进行校验,确保是有效的图片 |
选项
通过选项设置字段的约束,选项如下:
选项 | 说明 |
---|---|
null | 设置非空约束,默认为False |
blank | 表示字段允许为空,默认为False null是数据库范畴的概念,blank是表单验证范畴的 |
db_column | 指定字段的名称,缺省使用属性名 |
db_index | 表示为此字段创建索引,默认为False |
default | 默认值 |
primary_key | 设置主键约束,默认为False,通常作为AutoField的选项使用 |
unique | 设置唯一约束,默认为False |
实例演练
-
在SQLyog中新建数据库 test2
-
修改models.py中的模型类,编码如下:
from django.db import models
# 定义图书模型类BookInfo
class BookInfo(models.Model):
# 指定btitle对应的字段名为title
btitle = models.CharField(max_length=20, db_column='title')
bpub_date = models.DateField() # 发布日期
bread = models.IntegerField(default=0) # 阅读量
bcomment = models.IntegerField(default=0) # 评论量
isDelete = models.BooleanField(default=False) # 逻辑删除
# 定义人物模型类PersonInfo
class PersonInfo(models.Model):
pname = models.CharField(max_length=20) # 人物姓名
pgender = models.BooleanField(default=True) # 人物性别
isDelete = models.BooleanField(default=False) # 逻辑删除
# 人物描述,数据库中的字段可以为空,但后台管理页面的输入框不能为空
pcomment = models.CharField(max_length=200, null=True, blank=False)
-
生成迁移文件并执行,查看test2数据库中的内容