目录
模型是有关数据的唯一确定的信息源。它包含要存储数据的基本字段和行为。通常,每个模型都映射到单个数据库表。
Django 对各种数据库提供了很好的支持,包括:PostgreSQL、MySQL、SQLite、Oracle。
Django 为这些数据库提供了统一的调用API。 我们可以根据自己业务需求选择不同的数据库。
使用Django进行数据库开发的提示 :
MVT设计模式中的Model, 专门负责和数据库交互.对应(models.py)Model中内嵌了ORM框架, 所以不需要直接面向数据库编程.模型类和对象完成数据库表的增删改查.ORM框架就是把数据库表的行与相应的对象建立关联, 互相转换.使得数据库的操作面向对象.
Django 模型使用自带的 ORM。
对象关系映射(Object Relational Mapping,简称 ORM )用于实现面向对象编程语言里不同类型系统的数据之间的转换。
在ORM框架中,它帮我们把类和数据表进行了一个映射,可以让我们通过类和类对象就能操作它所对应的表格中的数据。ORM框架还有一个功能,它可以根据我们设计的类自动帮我们生成数据库中的表格,省去了我们自己建表的过程。ORM 在业务逻辑层和数据库层之间充当了桥梁的作用。
ORM 是通过使用描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到数据库中。

Django根据属性的类型确定以下信息:
模型类如果未指明表名,Django默认以小写app应用名_小写模型类名为数据库表名。
可通过db_table指明数据库表名。
django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。
默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key。
pk是主键的别名,若主键名为id2,那么pk是id2的别名。
具体语法如下:
属性=models.字段类型(选项)
| 类型 | 说明 |
|---|---|
| AutoField | 自动增长的IntegerField,通常不用指定,不指定时Django会自动创建属性名为id的自动增长属性 |
| BooleanField | 布尔字段,值为True或False |
| NullBooleanField | 支持Null、True、False三种值 |
| CharField | 字符串,参数max_length表示最大字符个数 |
| TextField | 大文本字段,一般超过4000个字符时使用 |
| IntegerField | 整数 |
| DecimalField | 十进制浮点数, 参数max_digits表示总位数, 参数decimal_places表示小数位数 |
| FloatField | 浮点数 |
| DateField | 日期, 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误 |
| TimeField | 时间,参数同DateField |
| DateTimeField | 日期时间,参数同DateField |
| FileField | 上传文件字段 |
| ImageField | 继承于FileField,对上传的内容进行校验,确保是有效的图片 |
| 选项 | 说明 |
|---|---|
| null | 如果为True,表示允许为空,默认值是False |
| blank | 如果为True,则该字段允许为空白,默认值是False |
| db_column | 字段的名称,如果未指定,则使用属性的名称 |
| db_index | 若值为True, 则在表中会为此字段创建索引,默认值是False |
| default | 默认 |
| primary_key | 若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用 |
| unique | 如果为True, 这个字段在表中必须有唯一值,默认值是False |
null是数据库范畴的概念,blank是表单验证范畴的
在设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:
CASCADE级联,删除主表数据时连通一起删除外键表中数据
PROTECT保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
SET_NULL设置为NULL,仅在该字段null=True允许为null时可用
SET_DEFAULT设置为默认值,仅在该字段设置了默认值时可用
SET()设置为特定值或者调用特定方法
DO_NOTHING不做任何操作,如果数据库前置指明级联性,此选项会抛出IntegrityError异常
以下为书籍信息管理的数据关系:书名和人物是 :一对多关系

要先分析出项目中所需要的数据, 然后设计数据库表.
书籍信息表
| 字段名 | 字段类型 | 字段说明 |
|---|---|---|
| id | AutoField | 主键 |
| name | CharField | 书名 |
| id | name |
|---|---|
| 1 | 斗罗大陆 |
| 2 | 牧龙师 |
人物信息表
| 字段名 | 字段类型 | 字段说明 |
|---|---|---|
| id | AutoField | 主键 |
| name | CharField | 人名 |
| gender | BooleanField | 性别 |
| book | ForeignKey | 外键 |
| id | name | gender | book |
|---|---|---|---|
| 1 | 唐三 | False | 1 |
| 2 | 小舞 | True | 1 |
| 3 | 祝明朗 | False | 2 |
| 4 | 黎云姿 | True | 2 |
定义模型类
根据书籍表结构设计模型类:
根据人物表结构设计模型类:
根据数据库表的设计
在models.py中定义模型类,继承自models.Model
- from django.db import models
-
- # Create your models here.
-
- # 准备书籍列表信息的模型类
- class BookInfo(models.Model):
- # 创建字段,字段类型...
- name = models.CharField(max_length=10, verbose_name='名称')
-
- class Meta:
- db_table = 'bookinfo' # 指明数据库表名
- verbose_name = '图书' # 在admin站点中显示的名称
-
- def __str__(self):
- """定义每个数据对象的显示信息"""
- return self.name
-
- # 准备人物列表信息的模型类
- class PeopleInfo(models.Model):
- GENDER_CHOICES = (
- (0, 'male'),
- (1, 'female')
- )
- name = models.CharField(max_length=20, verbose_name='名称')
- gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
- book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书') # 外键
-
- class Meta:
- db_table = 'peopleinfo'
- verbose_name = '人物信息'
-
- def __str__(self):
- return self.name
在settings.py中保存了数据库的连接配置信息,Django默认初始配置使用sqlite数据库。

使用MySQL数据库首先需要安装驱动程序
pip install PyMySQL
在Django的工程同名子目录的__init__.py文件中添加如下语句
- import pymysql
-
- pymysql.install_as_MySQLdb()

作用是让Django的ORM能以mysqldb的方式来调用PyMySQL。
先在MySQL中创建数据库
create database book charset=utf8;
修改DATABASES配置信息
- DATABASES = {
- 'default': {
- 'ENGINE': 'django.db.backends.mysql',
- 'HOST': '127.0.0.1', # 数据库主机
- 'PORT': 3306, # 数据库端口
- 'USER': 'samual', # 数据库用户名
- 'PASSWORD': 'mysql', # 数据库用户密码
- 'NAME': 'bookmanger' # 数据库名字
- }
- }
迁移由两步完成 :
1.生成迁移文件:根据模型类生成创建表的语句
python manage.py makemigrations
2. 执行迁移:根据第一步生成的语句在数据库中创建表
python manage.py migrate
在PyCharm中我们可以打开控制台下的【Terminal】来执行迁移命令:

执行迁移文件前:

生成迁移文件后,【migrations】目录下会生成【0001_initial.py】文件:

执行迁移:

完成后,我们打开MySQL中在指定的数据库就能看到执行迁移成功的表:

