Django模型(二)
Django模型(二)
文章目录
- Django模型(二)
- 一、字段查询
- 1.查看mysql数据库日志
- 二、条件运算符
- 1.查询等
- 2.模糊查询
- 3.空查询
- 4. 范围查询
- 5. 比较查询
- 6).日期查询
- 二、F对象:用于类属性之间的比较
- 三、Q对象:用于查询时条件之间的逻辑关系
- 四、聚合函数
- 五、查询集
- 1.返回查询集的过滤器如下:
- 2.返回单个值的过滤器如下:
- 3.判断某一个查询集中是否有数据:
- 4.两大特性
- 5.查询集的缓存
- 6.限制查询集
一、字段查询
实现sql中where的功能,调用过滤器filter()、exclude()、get(),下面以filter()为例。
通过"属性名_id"表示外键对应对象的id值
。
- 语法如下:
说明:属性名称和比较运算符间使用两个下划线,所以属性名不能包括多个下划线。
属性名称__比较运算符=值
1.查看mysql数据库日志
查看mysql数据库日志可以查看对数据库的操作记录。 mysql日志文件默认没有产生,需要做如下配置:
sudo vi /etc/mysql/mysql.conf.d/mysqld.conf
把68,69行前面的#去除,然后保存并使用如下命令重启mysql服务。
sudo service mysql restart
使用如下命令打开mysql日志文件。
sudo tail -f /var/log/mysql/mysql.log #可以实时查看数据库的日志内容
打开booktest/views.py文件,在index视图中编写如下查询代码:
二、条件运算符
1.查询等
exact:表示判等
例:查询编号为1的图书。
list=BookInfo.objects.filter(id__exact=1)
可简写为:
list=BookInfo.objects.filter(id=1)
2.模糊查询
contains:是否包含
说明:如果要包含%无需转义,直接写即可。
例:查询书名包含’传’的图书。
list = BookInfo.objects.filter(btitle__contains='传')
startswith、endswith:以指定值开头或结尾
例:查询书名以’部’结尾的图书
list = BookInfo.objects.filter(btitle__endswith='部')
以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写
,如iexact、icontains、istartswith、iendswith.
3.空查询
isnull:是否为null。
例:查询书名不为空的图书。
list = BookInfo.objects.filter(btitle__isnull=False)
4. 范围查询
in:是否包含在范围内。
例:查询编号为1或3或5的图书
list = BookInfo.objects.filter(id__in=[1, 3, 5])
5. 比较查询
gt、gte、lt、lte:大于、大于等于、小于、小于等于
例:查询编号大于3的图书
list = BookInfo.objects.filter(id__gt=3)
- 不等于的运算符,使用exclude()过滤器。
例:查询编号不等于3的图书
list = BookInfo.objects.exclude(id=3)
6).日期查询
year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
例:查询1980年发表的图书。
list = BookInfo.objects.filter(bpub_date__year=1980)
例:查询1980年1月1日后发表的图书。
list = BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))
filter方法示例:
条件格式:
模型类属性名__条件名=值
查询图书评论量为34的图书的信息:
a)判等 条件名:exact。
例:查询编号为1的图书。
BookInfo.objects.get(id=1)
b)模糊查询
例:查询书名包含’传’的图书。contains
BookInfo.objects.filter(btitle__contains=‘传’)
例:查询书名以’部’结尾的图书 endswith 开头:startswith
BookInfo.objects.filter(btitle__endswith=‘部’)
c)空查询 isnull
例:查询书名不为空的图书。isnull
select * from booktest_bookinfo where btitle is not null;
BookInfo.objects.filter(btitle__isnull=False)
d)范围查询 in
例:查询id为1或3或5的图书。
select * from booktest_bookinfo where id in (1,3,5);
BookInfo.objects.filter(id__in = [1,3,5])
e)比较查询 gt(greate than) lt(less than) gte(equal) 大于等于
lte 小于等于
例:查询id大于3的图书。
Select * from booktest_bookinfo where id>3;
BookInfo.objects.filter(id__gt=3)
f)日期查询
例:查询1980年发表的图书。
BookInfo.objects.filter(bpub_date__year=1980)
例:查询1980年1月1日后发表的图书。
from datetime import date
BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))
exclude方法示例:
例:查询id不为3的图书信息。
BookInfo.objects.exclude(id=3)
order_by方法示例:
作用:进行查询结果进行排序。
例:查询所有图书的信息,按照id从小到大进行排序。
BookInfo.objects.all().order_by(‘id’)
例:查询所有图书的信息,按照id从大到小进行排序。
BookInfo.objects.all().order_by(’-id’)
例:把id大于3的图书信息按阅读量从大到小排序显示。
BookInfo.objects.filter(id__gt=3).order_by(’-bread’)
二、F对象:用于类属性之间的比较
之前的查询都是对象的属性与常量值比较,两个属性怎么比较呢? 答:使用F对象,被定义在django.db.models中。
语法如下:
F(属性名)
例:查询阅读量大于等于评论量的图书。
from django.db.models import F
...
list = BookInfo.objects.filter(bread__gte=F('bcomment'))
可以在F对象上使用算数运算。
例:查询阅读量大于2倍评论量的图书。
list = BookInfo.objects.filter(bread__gt=F('bcomment') * 2)
三、Q对象:用于查询时条件之间的逻辑关系
多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字。
例:查询阅读量大于20,并且编号小于3的图书。
list=BookInfo.objects.filter(bread__gt=20,id__lt=3)
或
list=BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)
- 如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符,Q对象被义在django.db.models中。
- 语法如下:
Q(属性名__运算符=值)
例:查询阅读量大于20的图书,改写为Q对象如下。
from django.db.models import Q
...
list = BookInfo.objects.filter(Q(bread__gt=20))
Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或。
例:查询阅读量大于20,或编号小于3的图书,只能使用Q对象实现
list = BookInfo.objects.filter(Q(bread__gt=20) | Q(pk__lt=3))
Q对象前可以使用~操作符,表示非not。
例:查询编号不等于3的图书。
list = BookInfo.objects.filter(~Q(pk=3))
四、聚合函数
使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg,Count,Max,Min,Sum,被定义在django.db.models中。
对查询结果进行聚合操作
例:查询图书的总阅读量。
from django.db.models import Sum
...
list = BookInfo.objects.aggregate(Sum('bread'))
- 注意aggregate的返回值是一个字典类型,格式如下:
{'聚合类小写__属性名':值}
如:
{'sum__bread':3}
使用count时一般不使用aggregate()过滤器。
例:查询图书总数。
list = BookInfo.objects.count()
注意count函数的返回值是一个数字
。
五、查询集
查询集表示从数据库中获取的对象集合,在管理器上调用某些过滤器方法会返回查询集,查询集可以含有零个、一个或多个过滤器
。过滤器基于所给的参数限制查询的结果,从Sql的角度,查询集和select语句等价,过滤器像where和limit子句。
1.返回查询集的过滤器如下:
- all():返回所有数据。
filter():返回满足条件的数据
- exclude():返回满足条件之外的数据,相当于sql语句中where部分的not关键字。
- order_by():对结果进行排序。
2.返回单个值的过滤器如下:
- get():返回单个满足条件的对象
如果未找到会引发"模型类.DoesNotExist"异常。
如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常。
count():返回当前查询结果的总条数。
- aggregate():聚合,返回一个字典。
3.判断某一个查询集中是否有数据:
exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。
4.两大特性
惰性执行:创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用。
缓存:使用同一个查询集,第一次使用时会发生数据库的查询,然后把结果缓存下来,再次使用这个查询集时会使用缓存的数据。
示例:查询所有,编辑booktest/views.py的index视图,运行查看。
list=BookInfo.objects.all()
5.查询集的缓存
每个查询集都包含一个缓存来最小化对数据库的访问。
在新建的查询集中,缓存为空,首次对查询集求值时,会发生数据库查询,django会将查询的结果存在查询集的缓存中,并返回请求的结果,接下来对查询集求值将重用缓存中的结果。
- 演示:运行项目shell
python manage.py shell
情况一:如下是两个查询集,无法重用缓存,每次查询都会与数据库进行一次交互,增加了数据库的负载
。
from booktest.models import BookInfo
[book.id for book in BookInfo.objects.all()]
[book.id for book in BookInfo.objects.all()]
情况二:经过存储后,可以重用查询集,第二次使用缓存中的数据
。
list=BookInfo.objects.all()
[book.id for book in list]
[book.id for book in list]
6.限制查询集
可以对查询集进行取下标或切片操作,等同于sql中的limit和offset子句。
注意:不支持负数索引。
对查询集进行切片后返回一个新的查询集,不会立即执行查询。
方式 | 说明 |
---|---|
b[0] | 如果b[0]不存在,会抛出IndexError异常 |
b[0:1].get() | 如果b[0:1].get()不存在,会抛出DoesNotExist异常 |
exists:判断一个查询集中是否有数据。True False
示例:获取第1、2项,运行查看。
list=BookInfo.objects.all()[0:2]
Django模型(二)相关推荐
- 8. Django 模型(二)
Django 模型(二) 版权声明:本博客来自路飞学城Python全栈开发培训课件,仅用于学习之用,严禁用于商业用途. 欢迎访问路飞学城官网:https://www.luffycity.com/ 本节 ...
- Django基础五之Django模型层(二)多表操作
Django基础五之Django模型层(二)多表操作 一 创建模型 表和表之间的关系 一对一.多对一.多对多 # 作者表 比较常用的信息放在这个表中 class Author(models.Model ...
- python路由编程_Python Django基础二之URL路由系统
MVC和MTV框架 MVC Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务 ...
- Web开发-Django模型层
Django模型层 简述 Django框架处理业务的逻辑一般如下(省略图,源于网络,侵删) 可以看到,Django自带了一套ORM机制,这也是Django框架的核心-"全面",将一 ...
- Django模型(三)
Django模型(三) 文章目录 Django模型(三) 一.模型类关系 1.关系字段类型 2.一对多关系 3.多对多关系 二.关联查询 1.通过对象执行关联查询 2.通过模型类执行关联查询 三.自关 ...
- Django模型(一)
Django模型(一) 文章目录 Django模型(一) 一.配置Django使用mysql数据库 二.案例 1.定义模型类 2.打开booktest/models.py文件 3.迁移 4.测试数据 ...
- django模型的元数据Meta
模型的元数据,指的是"除了字段外的所有内容",例如排序方式.数据库表名.人类可读的单数或者复数名等等.所有的这些都是非必须的,甚至元数据本身对模型也是非必须的.但是,我要说但是,有 ...
- Django模型系统(一)
装饰器补充 django模型系统 一,数据库的链接配置 二,Django的ORM简介 三,模型的创建与激活 四,数据的增删改查 一,数据库的链接配置 django 链接mysql的配置流程: -安装 ...
- Django项目实践3 - Django模型(字段、数据库操作及模型继承)
http://blog.csdn.net/pipisorry/article/details/45725953 Django数据库字段类型(Field types) AutoField class A ...
最新文章
- 【Python】Label组件 Button组件 Checkbutton组件
- 10 个免费的服务器监控工具推荐
- 将用户添加到sudoers_Linux操作系统中sudo的使用和sudoers配置
- vue通信的N种方式
- 基于注解的方式装配bean
- 无人机自动悬停的实现方法
- [原]TCP/UDP使用细节备忘
- 底量超顶量超级大黑马指标源码_一旦出现底量超顶量形态,是超级大黑马诞生!...
- 7.23c++ STL自学笔记
- 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
- Luogu5607 [Ynoi2013] 无力回天 NOI2017
- 图结构 计算机视觉,探索图结构数据上的数据增强
- word中图片为嵌入式格式时显示不全_word插入图片嵌入式 word图片显示不全
- Windows 10电脑使用VMware虚拟机安装macOS苹果系统[一站式保姆级别教程]
- 计算机专业实用设计专利例子,计算机类实用新型专利有几个发明人
- 计算机绘图快捷键,计算机绘图常用软件快捷键大全
- 【课程】07 河口水循环
- 数学建模Word排版——样式
- 启动计算机引导win10,示例如何修复win10系统引导项
- 记录下使用阿里云的ces centos的linux系统搭建一个socks5代理步骤和踩坑过程
热门文章
- python getattr_python __getattr__
- 财政指标是什么意思_in the black是“在黑暗中”吗?那in the dark是什么意思?
- 代理、委托、钩子与打桩
- 互联网协议套件(TCP/IP)及七层OSI模型
- Ubuntu服务器上部署kodexplorer私有云盘
- Python会干掉Java, 一统天下?
- 苦酒入喉心作痛,红酒入鹅鹅想哭——震惊!勒索病毒想哭靠wine感染了Ubuntu16.04...
- redis StackExchange 主备 实现 demo
- mac osx wine 1.7.5 源码编译方法及中文乱码的解决
- Python菜鸟之路:Python基础-Python操作RabbitMQ