查询数据也是通过上面的objects对象进行操作,我们依然在shell中操作,常用的有下面几个方法
目录
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这两个值的