bailangsyc 2020-01-10
首先,我来介绍一下什么是ORM框架:
O是object,也就类对象的意思,R是relation,翻译成中文是关系,也就是关系数据库中数据表的意思,M是mapping,是映射的意思。在ORM框架中,它帮我们把类和数据表进行了一个映射,可以让我们通过类和类对象就能操作它所对应的表格中的数据。ORM框架还有一个功能,它可以根据我们设计的类自动帮我们生成数据库中的表格,省去了我们自己建表的过程。
django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的增删改查操作。
Django框架--ORM框架--数据库的关系,如下图所示:
既然用到的数据库,那么我们就不得不提python中一个第三方模块pymysql
pip install PyMySQL
from pymysql import install_as_MySQLdb install_as_MySQLdb()
这两句代码主要作用是,让Django框架能够以ORM框架的方式调用PyMySQL模块。
DATABASES = { ‘default‘: { ‘ENGINE‘: ‘django.db.backends.mysql‘, ‘HOST‘: ‘127.0.0.1‘, # 数据库主机 ‘PORT‘: 3306, # 数据库端口 ‘USER‘: ‘root‘, # 数据库用户名 ‘PASSWORD‘: ‘mysql‘, # 数据库用户密码 ‘NAME‘: ‘django_demo‘ # 数据库名字 } }
4. 在MySQL数据库中创建数据库
create database laowang charset=utf8;
以上,我们所有的准备工作就已准备完毕了。
那么,接下来我将为大家讲解一下ORM框架如何使用。
想要定义模型类,我们就需要知道什么是模型类,直白的说模型类就是数据库中的表,模型类中的属性就是数据表中的字段。
from django.db import models #定义图书模型类BookInfo class BookInfo(models.Model): btitle = models.CharField(max_length=20) bpub_date = models.DateField() bread = models.IntegerField(default=0) bcomment = models.IntegerField(default=0) is_delete = models.BooleanField(default=False) class Meta: db_table = ‘tb_books‘ # 指明数据库表名
注意:
使用ORM框架定义模型类时,模型类会自动帮我们在数据表中创建一个ID字段用作数据表中的字段,并且这个字段是自增长的。
当我们成功的定义了模型类以后,我们需要进行数据库迁移,否则数据库中不会生成数据表。
迁移命令:
# 生成数据库迁移文件 python manage.py makemigrations # 执行数据库迁移文件 python manage.py migrate
提示:
需要执行数据库迁移的子应用必须要在配置文件中进行注册。
当我们的定义的模型类增加新的字段时,也要重新迁移。
当我们的数据表出现问题时,我们可以删除生成的迁移文件,然后重新迁移数据库。
既然我们已经完成了,数据模型的定义,那么接下来我就带领大家对数据库中的数据使用ORM框架进行增删改查的操作。
# 第一种方式 book = BookInfo( btitle=‘西游记‘, bput_date=date(1988,1,1), bread=10, bcomment=10 ) book.save() # 第二种方式 BookInfo.objects.create( btitle=‘西厢记‘, bput_date=date(1988,1,1), bread=3540, bcomment=1230 )
# 第一种方式 BookInfo.objects.get(name=‘西游记‘).delete()
# 第一种方式 book = BookInfo.objects.get(name=‘西游记‘) book.name = ‘西游记后传‘ book.save() # 第二种方式 BookInfo.objects.filter(name=‘西厢记‘).update(name=‘儒林外史‘)
基本查询方式:
# 第一种方式:查询全部数据 BookInfo.objects.all() # 第二种方式:查询全部符合指定条件的数据 BookInfo.objects.filter(id__gt=1) # 第三种方式:查询出一条符合条件的数据 BookInfo.objects.get(name=‘西厢记‘)
高级查询方式:
‘‘‘ 模糊查询: 字段__contains=‘值‘ 模型类.objects.filter(字段__contains=‘值‘) 范围查询: 字段__in=[值1,....] 模型类.objects.filter(字段__in=[‘值1‘,...]) 空查询: 字段__isnull=True 为空 字段__isnull=False 非空 模型类.objects.filter(字段__isnull=True) 比较查询: 字段__gt=值 --> 大于 字段__gte=值 --> 大于等于 字段__lt=值 --> 小于 字段__lte=值 --> 大于等于 模型类.objects.filter(字段__gt=值) 模型类.objects.filter(字段__gte=值) 逻辑查询: F对象:两个端相互比较时使用F对象 from django.db.models import F BookInfo.objects.filter(bread__gte=F(‘bcomment‘)) Q对象:一般是使用逻辑或(|)时使用Q对象 from django.db.models import Q BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3)) 聚合函数: Avg(字段名) 平均, Count(字段名) 数量, Max(字段名) 最大, Min(字段名) 最小, Sum(字段名) 求和 count() 统计数量 排序: order_by(字段名) # 升序 order_by(-字段名) # 降序 关联查询: 一对多查询: 一关系的模型类.多关系模型类名小写_set.get/filter(查询条件) 一关系的模型类.自定义的related_name的值.get/filter(查询条件) 多对一查询: 多关系的模型类.外键名.get/filter(查询条件) ‘‘‘
注意:
使用filter、all查询出来的数据是一个查询集,不能直接使用,想使用需要将查询集便利出来。
# 获取模型类集合 book_model_list = BookInfo.objects.filter(id__gte=3) # 便利模型类,将集合中的模型便利出来 for book_model in book_model_list: print(book_model.id) print(book_model.name)