咱们以前操做数据库是经过写sql语句,那么能不能不写sql语句就能够操做数据库呢? 固然能够,这就要使用ORM框架了。python
O是object,也就类对象的意思,R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思,M是mapping,是映射的意思。在ORM框架中,它帮咱们把类和数据表进行了一个映射,可让咱们经过类和类对象就能操做它所对应的表格中的数据。ORM框架还有一个功能,它能够根据咱们设计的类自动帮咱们生成数据库中的表格,省去了咱们本身建表的过程。mysql
django中内嵌了ORM框架,不须要直接面向数据库编程,而是定义模型类,经过模型类和对象完成数据表的增删改查操做。sql
使用django进行数据库开发有三个步骤:shell
1.在models.py中定义模型类数据库
2.迁移django
3.经过类和对象完成数据增删改查操做编程
下面咱们就以保存图书信息为例来给你们介绍Django中进行数据库开发的整个流程。session
在booktest下的models.py中建立模型,须要继承models.Model类:app
from django.db import models #设计和表对应的类 模型类 # Create your models here. #图书类 class BookInfo(models.Model): '''图书模型类''' #图书名称 CharField说明是一个字符串 max_length指定字符串的最大长度 btitle = models.CharField(max_length=20) #出版日期 DateField说明是一个日期类型 bpub_date = models.DateField()
迁移有两步:框架
1.生成迁移文件:根据模型类生成建立表的迁移文件。
2.执行迁移:根据第一步生成的迁移文件在数据库中建立表。
生成迁移文件命令以下:
python manage.py makemigrations
执行生成迁移文件命令后,会在应用booktest目录下的migrations目录中生成迁移文件。
咱们打开这个文件,内容以下:
# Generated by Django 3.0.2 on 2020-01-15 07:01 from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='BookInfo', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('btitle', models.CharField(max_length=20)), ('bpub_date', models.DateField()), ], ), ]
Django框架根据咱们设计的模型类生成了迁移文件,在迁移文件中咱们能够看到fields列表中每个元素跟BookInfo类属性名以及属性的类型是一致的。同时咱们发现多了一个id项,这一项是Django框架帮咱们自动生成的,在建立表的时候id就会做为对应表的主键列,而且主键列自动增加。
当执行迁移命令后,Django框架会读取迁移文件自动帮咱们在数据库中生成对应的表格。
Django默认采用sqlite3数据库,上图中的db.sqlite3就是Django框架帮咱们自动生成的数据库文件。 sqlite3是一个很小的数据库,一般用在手机中,它跟mysql同样,咱们也能够经过sql语句来操做它。
可是咱们通常是使用mysql做为案例的,因此咱们须要将模型转为mysql数据库中的表。
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'bms', # 要链接的数据库,链接前须要建立好 'USER':'root', # 链接数据库的用户名 'PASSWORD':'root', # 链接数据库的密码 'HOST':'127.0.0.1', # 链接主机,默认本机 'PORT':3306 # 端口 默认3306 } }
NAME即数据库的名字,在mysql链接前该数据库必须已经建立,而上面的sqlite数据库下的db.sqlite3则是项目自动建立 USER和PASSWORD分别是数据库的用户名和密码。设置完后,再启动咱们的Django项目前,咱们须要激活咱们的mysql。而后,启动项目,会报错:no module named MySQLdb 。这是由于django默认你导入的驱动是MySQLdb,但是MySQLdb对于py3有很大问题,因此咱们须要的驱动是PyMySQL。因此咱们还须要找到项目名下的__init__,在里面写入:
import pymysql pymysql.install_as_MySQLdb()
而后咱们还要注意一个报错,报错以下:
django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.
MySQLclient目前只支持到python3.4,所以若是使用的更高版本的python,须要修改以下:
经过路径查找E:\pythondaima\venv\Lib\site-packages\django\db\backends\mysql\base..py。在这个路径下找到以下地方:
注释掉就OK了。
还有就是上一章讲过的,确保配置文件中的INSTALLED_APPS中写入咱们建立的app名称。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'booktest', ]
删除原来生成的文件,从新运行两条命令:
python manage.py makemigrations
python manage.py migrate
咱们能够看到生成的表名叫作booktest_bookinfo,booktest是应用的名字,bookinfo是模型类的名字。
咱们再弄个角色类:
在booktest/models.py,定义角色类:
class RoleInfo(models.Model): '''角色人物模型类''' # 角色名 rname = models.CharField(max_length=20) # 性别 rgender = models.BooleanField() # 备注 rcomment = models.CharField(max_length=100) # 关系属性 rbook = models.ForeignKey('BookInfo',on_delete=models.CASCADE)
在外键值的后面加上 on_delete=models.CASCADE,由于在django2.0后,定义外键和一对一关系的时候须要加on_delete选项,此参数为了不两个表里的数据不一致问题,否则会报错。
这里要说明的是,BookInfo类和RoleInfo类之间具备一对多的关系,这个一对多的关系应该定义在多的那个类,也就是RoleInfo类中。
在咱们以后迁移生成表的时候,Django框架就会自动帮咱们在图书表和角色表之间创建一个外键关系。
python manage.py makemigrations
python manage.py migrate
完成数据表的迁移以后,下面就能够经过进入项目的shell,进行简单的API操做。若是须要退出项目,可使用ctrl+d快捷键或输入quit()。
进入项目shell的命令:
python manage.py shell
首先引入booktest/models中的类:
from booktest.models import BookInfo,RoleInfo
查询全部图书信息:
BookInfo.objects.all()
由于当前并无数据,因此返回空列表。
新建图书对象:
b=BookInfo() b.btitle="斗罗大陆" from datetime import date b.bpub_date=date(2008,12,14) b.save()
再次查询全部图书信息:
BookInfo.objects.all()
查找图书信息并查看值:
b=BookInfo.objects.get(id=1)
b
b.id
b.btitle
b.bpub_date
修改图书信息:
b.bpub_date=date(2017,1,1)
b.save()
b.bpub_date
删除图书信息:
b.delete()
对于RoleInfo能够按照上面的方式进行增删改查操做。
建立一个BookInfo对象
b=BookInfo() b.btitle='abc' b.bpub_date=date(2017,1,1) b.save()
建立一个RoleInfo对象
r=RoleInfo() r.rname='a1' r.rgender=False r.rcomment='he is a boy' r.rbook=b r.save()
图书与角色是一对多的关系,django中提供了关联的操做方式。
得到关联集合:返回当前book对象的全部role。
b.roleinfo_set.all()