14.查询数据

查询数据也是通过上面的objects对象进行操作,我们依然在shell中操作,常用的有下面几个方法

目录

1 查询所有数据 all()

2 查询指定字段

2.1  返回对象中的元素为字典 values()

2.2  返回对象中的元素为元组 values_list()

3  排序查询 order_by()

4  QuerySet的组合使用

5  查看mysql语句 query

6  查询数据配合模版层

7  条件查询

7.1  条件内的所有数据 filter()

7.2  条件外的所有数据 exclude()

7.3  条件内的唯一数据 get

7.4  查询谓词

7.4.1  等值 __exact

7.4.2  包含 __contains

7.4.3  以...开始 __startswith

7.4.4  以...结束 __endswith

7.4.5  大于 __gt

7.4.6  大于等于 __gte

7.4.7  小于 __lt

7.4.8  小于等于 __lte

7.4.9  多个相同字段条件 __in

7.4.10  指定区间 __range


1 查询所有数据 all()

等同与mysql中输入select * from tabel[表名称],会返回QuerySet容器对象,我们拿这个对象当列表用就可以了,我们先将all()的返回对象赋值给一个变量

我们看一下这个对象的类型

我们再打印出来看一下

  • 括号里的值是id值

发现里面有五个小对象,我们可以使用属性名称,提取小对象指定属性的内容

我们觉得需要写一个循环才能在orm中看到数据是非常不方便的,我们想打印大对象的时候就可以看到整个数据库的内容,我们可以在models.py中加入这些

  • 可以根据项目的需要显示部分,比如只显示书名
  • 如果有mata类的时候,注意不要写在mata类里面

之后重新开启shell,我们再进行打印

  • 终端不用关,exit()后,再输入 python manage.py shell 开启shell即可

这样改动之后是不会影响我们的循环的

2 查询指定字段

等同与mysql中的 select book_name[字段名称] from book_book_list[表名称]

2.1  返回对象中的元素为字典 values()

我们现在查询book_name这个字段

它会返回QuerySet,其中元素的格式是字典

可以同时查询多个字段

如果你要进行取值的话,要使用字典的方式进行取值

这样就不行了

2.2  返回对象中的元素为元组 values_list()

同样可以查询多个字段,元组内容的顺序与传入字段的顺序是一致的

这个时候就要用元组的方法进行取值了

3  排序查询 order_by()

我们现在按照retail_price进行升序排列,我们对照all()看一下

默认是升序排列,如果我们想降序排列,我们在字段前加一个负号

写的时候可以给多个字段,如果第一个字段的值相等,那么他就会按第二个字段的值进行排序

4  QuerySet的组合使用

我们可以对QuerySet调用ORM任意的方法,比如我现在要对values进行order_by

使用price进行升序排列并只显示book_name

用values_list也可以

先order_by再values也可以

5  查看mysql语句 query

在orm中可以查看给mysql中发了什么语句,只要对象是QuerySet就可以拿到,所以并不是所有的ORM语句中都可以通过query拿到sql语句的

下面就是all()给mysql发的实际发的语句

我们把显示出来的结果复制进mysql中看一下

发现没有问题,我们再试一下order_by与values_list

在mysql中values和values_list是一样的,只是在orm中返回的格式不一样

6  查询数据配合模版层

我们搞一个这样的页面,op中给两个a标签,两个a标签都是空链接

我们首先在应用中创建urls.py,然后写上如下内容

然后在主路由的urls.py,我们加入这个内容

之后进入应用的视图,加入如图内容

这里的from .models import book_list 就是orm中的类

最后写html

之后开启服务,然后进入路由就可以看到这个效果了

7  条件查询

7.1  条件内的所有数据 filter()

我们比如现在想查询 清华大学出版社 的所有书

发现返回对象依然是QuerySet

我们也可以有多个条件,多个条件是 与 的关系,比如我们现在想查询price是70,且是清华大学出版社的书

在这里是不能使用其他符号的

在mysql中,filter实际对应的是WHERE后的内容

如果没找到会返回空的Queryset

如果你想对同一个字段取多个值,可以用竖杠连接,达到相加的效果

也可以使用查询谓词的__in,我们下面会提到

7.2  条件外的所有数据 exclude()

比如我现在不想要清华大学出版社的书

也可以添加多个条件,多个条件是 与 的关系,比如我现在不想要 清华大学出版社price为90 的书

发现符合项变多了,因为我又加入了一个条件,这两个条件都满足的只有一本书

同样不可以使用其他符号

mysql中对应的是where not

如果没找到会返回空的Queryset

7.3  条件内的唯一数据 get

如果不唯一就会报错,比如我们现在get 清华大学出版社 的书

那么我们现在找 清华大学出版社price为20 的书

我们注意get方法返回的结果并不是QuerySet

如果没有的话,会报错,比如我们现在找 清华大学出版社price为21 的书

所以get常跟unique的字段配合使用,比如id

尽管如此,我们为了提高容错,我们使用的时候还是会加一个try

7.4  查询谓词

我们之前在条件查询中用的全是等号,现在我们想用非等号,那么我们要使用查询谓词,查询谓词有很多,我们下面说几个常用的,可以通过看文档找到所有的,建议是用哪个回来到网上搜一下

只要需要查询条件的地方都可以写查询谓词,不仅只有filter可以使用,exclude等其他条件查询都可以使用

7.4.1  等值 __exact

效果和等号相似,我们上面是查询price为50的书

它更多使用在字段值为null的时候,我们后期用到的时候再提

7.4.2  包含 __contains

我现在查询pub中带有清华两个字的

7.4.3  以...开始 __startswith

7.4.4  以...结束 __endswith

7.4.5  大于 __gt

price大于50的书

7.4.6  大于等于 __gte

price大于等于20的书

7.4.7  小于 __lt

price小于90的书

7.4.8  小于等于 __lte

price小于等于90的书

7.4.9  多个相同字段条件 __in

查询 清华大学出版社与机械工业出版社 的书

7.4.10  指定区间 __range

查询price是20-70的书

我们发现是包含20和70这两个值的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Suyuoa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值