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模型(二)相关推荐

  1. 8. Django 模型(二)

    Django 模型(二) 版权声明:本博客来自路飞学城Python全栈开发培训课件,仅用于学习之用,严禁用于商业用途. 欢迎访问路飞学城官网:https://www.luffycity.com/ 本节 ...

  2. Django基础五之Django模型层(二)多表操作

    Django基础五之Django模型层(二)多表操作 一 创建模型 表和表之间的关系 一对一.多对一.多对多 # 作者表 比较常用的信息放在这个表中 class Author(models.Model ...

  3. python路由编程_Python Django基础二之URL路由系统

    MVC和MTV框架 MVC Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务 ...

  4. Web开发-Django模型层

    Django模型层 简述 Django框架处理业务的逻辑一般如下(省略图,源于网络,侵删) 可以看到,Django自带了一套ORM机制,这也是Django框架的核心-"全面",将一 ...

  5. Django模型(三)

    Django模型(三) 文章目录 Django模型(三) 一.模型类关系 1.关系字段类型 2.一对多关系 3.多对多关系 二.关联查询 1.通过对象执行关联查询 2.通过模型类执行关联查询 三.自关 ...

  6. Django模型(一)

    Django模型(一) 文章目录 Django模型(一) 一.配置Django使用mysql数据库 二.案例 1.定义模型类 2.打开booktest/models.py文件 3.迁移 4.测试数据 ...

  7. django模型的元数据Meta

    模型的元数据,指的是"除了字段外的所有内容",例如排序方式.数据库表名.人类可读的单数或者复数名等等.所有的这些都是非必须的,甚至元数据本身对模型也是非必须的.但是,我要说但是,有 ...

  8. Django模型系统(一)

    装饰器补充 django模型系统 一,数据库的链接配置 二,Django的ORM简介 三,模型的创建与激活 四,数据的增删改查 一,数据库的链接配置 django  链接mysql的配置流程: -安装 ...

  9. Django项目实践3 - Django模型(字段、数据库操作及模型继承)

    http://blog.csdn.net/pipisorry/article/details/45725953 Django数据库字段类型(Field types) AutoField class A ...

最新文章

  1. 【Python】Label组件 Button组件 Checkbutton组件
  2. 10 个免费的服务器监控工具推荐
  3. 将用户添加到sudoers_Linux操作系统中sudo的使用和sudoers配置
  4. vue通信的N种方式
  5. 基于注解的方式装配bean
  6. 无人机自动悬停的实现方法
  7. [原]TCP/UDP使用细节备忘
  8. 底量超顶量超级大黑马指标源码_一旦出现底量超顶量形态,是超级大黑马诞生!...
  9. 7.23c++ STL自学笔记
  10. 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
  11. Luogu5607 [Ynoi2013] 无力回天 NOI2017
  12. 图结构 计算机视觉,探索图结构数据上的数据增强
  13. word中图片为嵌入式格式时显示不全_word插入图片嵌入式 word图片显示不全
  14. Windows 10电脑使用VMware虚拟机安装macOS苹果系统[一站式保姆级别教程]
  15. 计算机专业实用设计专利例子,计算机类实用新型专利有几个发明人
  16. 计算机绘图快捷键,计算机绘图常用软件快捷键大全
  17. 【课程】07 河口水循环
  18. 数学建模Word排版——样式
  19. 启动计算机引导win10,示例如何修复win10系统引导项
  20. 记录下使用阿里云的ces centos的linux系统搭建一个socks5代理步骤和踩坑过程

热门文章

  1. python getattr_python __getattr__
  2. 财政指标是什么意思_in the black是“在黑暗中”吗?那in the dark是什么意思?
  3. 代理、委托、钩子与打桩
  4. 互联网协议套件(TCP/IP)及七层OSI模型
  5. Ubuntu服务器上部署kodexplorer私有云盘
  6. Python会干掉Java, 一统天下?
  7. 苦酒入喉心作痛,红酒入鹅鹅想哭——震惊!勒索病毒想哭靠wine感染了Ubuntu16.04...
  8. redis StackExchange 主备 实现 demo
  9. mac osx wine 1.7.5 源码编译方法及中文乱码的解决
  10. Python菜鸟之路:Python基础-Python操作RabbitMQ