一、模型类
1、ORM框架
O是object,也就类对象的意思。
R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思。
M是mapping,是映射的意思。
在ORM框架中,它帮我们把类和数据表进行了一个映射,可以让我们通过类和类对象就能操作它所对应的表格中的数据。ORM框架还有一个功能,它可以根据我们设计的类自动帮我们生成数据库中的表格,省去了我们自己建表的过程。
django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作。
使用django进行数据库开发的步骤如下:
- 1.在models.py中定义模型类
- 2.迁移
- 3.通过类和对象完成数据增删改查操作
下面我们以保存图书信息为例来给大家介绍Django中进行数据库开发的整个流程。
2、模型类设计
模型类定义在models.py文件中,继承自models.Model类。且不需要定义主键列,在生成时会自动添加,并且值为自动增长。
我们建立一个图书类:
- 类名:BookInfo
- 图书名称:btitle
- 图书发布日期:bpub_date
# 图书类
class BookInfo(models.Model):
"""图书模型类"""
# 图书名称,CharField:字符串,max_length:最大长度
btitle = models.CharField(max_length=20)
# 出版日期,DateField:日期类型,
bpub_date = models.DateField()
- 注意要继承models.Model类
3、模型类生成表
迁移由两步完成:
- 1.生成迁移文件:根据模型类生成创建表的迁移文件。
- 2.执行迁移:根据第一步生成的迁移文件在数据库中创建表。
1)生成迁移文件
使用命令:
python manage.py makemigrations
我们看到生成成功后多出了一个0001_initial.py文件
Django框架根据我们设计的模型类生成了迁移文件,在迁移文件中我们可以看到fields列表中每一个元素跟BookInfo类属性名以及属性的类型是一致的。同时我们发现多了一个id项,这一项是Django框架帮我们自动生成的,在创建表的时候id就会作为对应表的主键列,并且主键列自动增长。
2)执行迁移命令:
python manage.py migrate
当执行迁移命令后,Django框架会读取迁移文件自动帮我们在数据库中生成对应的表格。
成功迁移后会多出一个db.sqlite3文件。
Django默认采用sqlite3数据库,上图中的db.sqlite3就是Django框架帮我们自动生成的数据库文件。 sqlite3是一个很小的数据库,通常用在手机中,它跟mysql一样,我们也可以通过sql语句来操作它。
下面使用sqliteman打开db.sqlite3文件进行查看。如果没有安装sqliteman,需要先使用如下命令进行安装(Linux)。
sudo apt-get install sqliteman
- windows下好像也能用sqliteman,我懒得下,直接用Navicate Premium 15开的
之后打开db.sqlite3文件,点开Tables找到booktest_bookinfo,可以发现这个表中有三个列,列名跟BookInfo中类属性的名字是一样的。
默认生成的表名称
细心的同学会发现我们上面生成的表的名字叫做booktest_bookinfo,booktest是应用的名字,bookinfo是模型类的名字。
4、通过模型类操作数据表
完成数据表的迁移之后,下面就可以通过进入项目的shell,进行简单的API操作。如果需要退出项目,可以使用ctrl+d快捷键或输入quit()。
进入项目shell的命令:
python manage.py shell
首先导入模型类:
from booktest.models import BookInfo
1)向booktest_bookinfo表中插入一条数据。
from datetime import datetime
b = BookInfo() #定义一个BookInfo类的对象
b.btitle ='天龙八部' #定义b对象的属性并赋值
b.bpub_date = date(1990,10,11)
b.save() #才会将数据保存进数据库
- 注意执行b.save()之后才会在数据库中看见新添加的数据
2) 查询出booktest_bookinfo表中id为1的数据。
In [11]: b2 = BookInfo.objects.get(id=1)
In [12]: b2.btitle
Out[12]: '天龙八部'
In [13]: b2.bpub_date
Out[13]: datetime.date(1990, 1, 1)
In [14]: b2.id
Out[14]: 1
3)改变b2对应图书的出版日期。
In [17]: b2.bpub_date = date(1990,10,10)
In [18]: b.save()
In [20]: b2.bpub_date
Out[20]: datetime.date(1990, 10, 10)
4)删除b对应的图书的数据
In [21]: b2.delete()
Out[21]: (1, {'booktest.BookInfo': 1})
5、关联操作
首先复习一下上面生成表的操作:添加一个HeroInfo类:
首先在model.py中新增HeroInfo类
class HeroInfo(models.Model):
"""英雄人物模型类"""
# 英雄名 hname
hname = models.CharField(max_length=20)
# 性别 hgender,默认False代表男性
hgender = models.BooleanField(default=False)
# 备注 hcomment
hcomment = models.CharField(max_length=128)
# 关系属性 book,建立图书类和英雄人物类之间的一对多关系
# 关系属性对应的表的字段名格式:关系属性名_id
hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE)
生成迁移文件
python manage.py makemigrations
迁移:
python manage.py migrate
进入项目shell:
python manage.py shell
BookInfo新建表:
In [1]: from booktest.models import BookInfo,HeroInfo
In [2]: b = BookInfo()
In [3]: b.btitle = '天龙八部'
In [4]: from datetime import date
In [5]: b.bpub_date = date(1990,1,1)
In [6]: b.save()
HeroInfo新建表:
In [7]: h = HeroInfo()
In [8]: h.hname = '段誉'
In [9]: h.hgender = False
In [10]: h.hcomment = '六脉神剑'
In [11]: h.hbook = b
In [12]: h.save()
- 注意hbook表示关系属性,Book和Hero是一对多的关系,我们把b赋给h的hbook,就完成了英雄对应图书的操作
再建立一个英雄:
In [13]: h2 = HeroInfo()
In [14]: h2.hname = '乔峰'
In [15]: h2.hcomment = '降龙十八掌'
In [16]: h2.hbook = b
In [17]: h2.save()
获得关联集合:返回当前book对象的所有hero。
In [25]: b.heroinfo_set.all()
Out[25]: <QuerySet [<HeroInfo: HeroInfo object (1)>, <HeroInfo: HeroInfo object (2)>]>
- 返回了一个列表,里面有两个元素,代表HeroInfo表中有两项。
HeroInfo:
In [26]: HeroInfo.objects.all()
Out[26]: <QuerySet [<HeroInfo: HeroInfo object (1)>, <HeroInfo: HeroInfo object (2)>]>
BookInfo:
In [28]: BookInfo.objects.all()
Out[28]: <QuerySet [<BookInfo: BookInfo object (2)>]>