ORM框架
- O: object,类和对象
- R: relation,关系,关系数据库中数据表
- M: mapping,映射
在ORM框架中,它帮我们把类和数据表进行了一个映射,可以让我们通过类和类对象就能操作它所对应的表格中的数据。ORM框架还有一个功能,它可以根据我们设计的类自动帮我们生成数据库中的表格,省去了我们自己建表的过程。
django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作。
orm框架的作用:
- 建立类和表的关系,操作数据库不需要再写sql语句,通过类和对象就可以操作数据库
- 根据模型类生成表
-
通过方便的配置就可以进行数据库的切换
模型类设计
模型类定义在models.py文件中,继承自models.Model类。不需要定义主键列,在生成时会自动添加,并且值为自动增长
图书类:
- 类名:BookInfo
- 图书名称:b_title
- 图书发布日期:b_pubdate
from django.db import models
# Create your models here.
class BookInfo(models.Model):
"""图书模型类"""
# 书名·CharField字符串类型·max_length指定最大长度
b_title = models.CharField(max_length=30)
# 发布日期·DateField日期类型
b_pubdate = models.DateField()
迁移
迁移前目录结构:
迁移由两步完成:
- 1.生成迁移文件:根据模型类生成创建表的迁移文件。
- 2.执行迁移:根据第一步生成的迁移文件在数据库中创建表。
生成迁移文件命令:
python manage.py makemigrations
执行生成迁移文件命令后,会在应用booktest/migrations目录中生成迁移文件0001_initial.py,
执行迁移命令:
python manage.py migrate
当执行迁移命令后,Django框架会读取迁移文件自动帮我们在数据库中生成对应的表格。
迁移后目录结构如下图:
Django默认采用sqlite3数据库,上图中的db.sqlite3就是Django框架帮我们自动生成的数据库文件。 sqlite3是一个很小的数据库,通常
在手机中,它跟mysql一样,我们也可以通过sql语句来操作它。视频上是使用sqliteman打开db.sqlite3文件进行查看。没有sqliteman,需
要先使用命令sudo apt-get install sqliteman进行安装。
我这里安装的是SQLiteFlow试用版,因为以后就不用sqlite
打开后如图:
打开db.sqlite3文件
默认生成的表名称
我们上面生成的表的名字叫做booktest_bookinfo,booktest是应用的名字,bookinfo是模型类的名字。
数据表的默认名称为:<app_name>_<model_name>,例:booktest_bookinfo
id不用我们自己设计,默认自增。
设计完图书类,然后再设计图书里的人物即英雄类,然后生成迁移文件并迁移,英雄类:
- 类名:HeroInfo
- 英雄姓名:h_name
- 英雄性别:h_gender
- 英雄简介:h_comment
- 英雄所属图书:h_book
class HeroInfo(models.Model):
"""英雄模型类"""
# 英雄名称
h_name = models.CharField()
# 英雄性别·BooleanField是bool类型,default设置默认值,False为男
h_gender = models.BooleanField(default=False)
# 英雄简介
h_comment = models.CharField(max_length=200)
# 英雄所属图书·关系属性,建立BookInfo和HeroInfo一对多关系
h_book = models.ForeignKey("BookInfo")
在我们之后迁移生成表的时候,Django框架就会自动帮我们在图书表和英雄表之间建立一个外键关系。
迁移完成后数据会有两个表,如下图:
通过模型类操作数据表
进入项目shell的命令:
python manage.py shell
以下为在shell终端中演示的例子:
首先导入模型类:
from booktest.models import BookInfo,HeroInfo
1、向booktest_bookinfo表中插入一条数据
b = BookInfo() # 定义一个BookInfo类的对象
b.btitle ='天龙八部' # 定义b对象的属性并赋值
b.bpub_date = date(1990,1,11)
b.save() # 才会将数据保存进数据库
2、查询出booktest_bookinfo表中id为1的数据。
b = BookInfo.objects.get(id=1)
3、在上一步的基础上改变b对应图书的出版日期。
b.b_pubdate = date(1989,10,21)
b.save() # 才会更新表格中的数据
4、紧接上一步,删除b对应的图书的数据。
b.delete() # 删除
5、向booktest_heroInfo表中插入一条数据。
h = HeroInfo()
h.h_name = '郭靖'
h.h_gender = False
h.h_comment = ‘降龙十八掌’
h.h_book = b2 # 给关系属性赋值,英雄对象所属的图书对象
h.save()
6、查询图书表里面的所有内容。
BookInfo.objects.all()
HeroInfo.objects.all()
shell代码:
MacBook-Pro:test1 bianyachao$ python manage.py shell
Python 3.5.6 |Anaconda, Inc.| (default, Aug 26 2018, 16:30:03)
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from booktest.models import BookInfo, HeroInfo
>>> from datetime import date
>>> b = BookInfo()
>>> b.b_title = "天龙八部"
>>> b.b_pubdate = date(1990,1,11)
>>> b.save()
>>> b2 = BookInfo()
>>> b2.b_title = "射雕英雄传"
>>> b2.b_pubdate = date(1991,2,22)
>>> b.save()
>>> b2.save()
>>> b = BookInfo.objects.get(id=1)
>>> type(b)
<class 'booktest.models.BookInfo'>
>>> b.b_title
'天龙八部'
>>> b.b_pubdate
datetime.date(1990, 1, 11)
>>> b.b_pubdate = date(1989,2,10)
>>> b.save()
>>> h = HeroInfo()
>>> h.h_name = '郭靖'
>>> h.h_gender = False
>>> h.h_comment = '降龙十八掌'
>>> h.h_book = b2
>>> h.save()
>>> BookInfo.objects.all()
[<BookInfo: BookInfo object>, <BookInfo: BookInfo object>]
>>> HeroInfo.objects.all()
[<HeroInfo: HeroInfo object>]
>>>
关系操作
查询出id为2的图书中所有英雄人物的信息
b = BookInfo.objects.get(id=2)
b.heroinfo_set.all() # 查询出b图书中所有英雄人物的信息