查看 orm 内部 sql 语句的方法
- 看是否是 queryset 对象,是的话,可直接.query 查看 SQL 语句;
- 在 django 配置文件中,配置相关参数,orm 查询时自动打印 sql 语句;
查询方法
all()
:查询所有结果filter(**kwargs)
:它包含了与所给筛选条件相匹配的对象get(**kwargs)
:返回数据对象,结果只有一个,没匹配到报错exclude(**kwargs)
:它包含了与所给筛选条件不匹配的对象
order_by(*field)
:对查询结果排序;默认是升序,加 - 就是降序
reverse()
:对查询结果反向排序
count()
:返回数据库中匹配查询 (QuerySet)
first()
:返回第一条记录last()
:返回最后一条记录exists()
:存在返回 True,否则返回 False
values(*field)
:返回一个 ValueQuerySet 对象,运行后得到的并不是一系列
values_list(*field)
:它与 values () 类似
distinct()
:从返回结果中剔除重复纪录
双下滑查询
__gt
:大于
__lt
:小于
__gte
:大于等于
__lte
: 小于等于
__in:
:或者
__range
:区间 左右都包括
__contains
:模糊匹配
__startswith
:以… 开头
- ``__endswith`:以… 结尾
__year
:查询年相关的
多表查询
一对多
增
改
删
多对多
增 (add)
既可以传数字也可以传对象并且支持一次性传多个,逗号隔开即可
改 (set)
- set 中要传可迭代对象,可迭代对象中 可以是多个数字组合也可以是多个对象组合;
- 数字与对象不要混着用!!!
删 (remove | clear)
对象点击多对多虚拟字段 会直接跨到多对多的第三张表
- remove 支持传数字,对象,并且可以传多个;
- clear 不需要传任何参数
跨表查询
- 正向与反向概念
正向查询按外键字段查,反向查询按表名小写
- 一对一
- 正向:author— 关联字段在 author 表里 —>authordetail 按字段
- 反向:authordetail— 关联字段在 author 表里 —>author 按表名小写
- 一对多
- 正向:book— 关联字段在 book 表里 —>publish 按字段
- 反向:publish— 关联字段在 book 表里 —>book 按表名小写_set.all () 因为一个出版社对应着多个图书
- 多对多
- 正向:book— 关联字段在 book 表里 —>author 按字段
- 反向:author— 关联字段在 book 表里 —>book 按表名小写_set.all () 因为一个作者对应着多个图书
子查询
将一张表的查询结果当做另外一个查询语句的条件
当反向查询的结果有多个时,要在后面加上_set;
连表操作 (基于__)
- 只要表里面有外键字段,你就可以无限制跨多张表
- 如:
外键字段1外键字段2...外键字段__普通字段n
聚合查询 (aggregate)
最大,最小,个数,平均,总和
aggregate(后面可跟多个函数)
分组查询 (annotate)
models. 那个表名就以那个分组
F 查询
本质就是从数据库中获取某个字段的值
Q 查询
默认 and, 可人为改为 or , not
查询优化
orm 内所有的语句操作都是惰性查询
只会在你真正需要数据的时候才会走数据库,这样有利于减轻数据库压力
- only 与 defer
- only
- 会将 only () 内的字段一次性的查出来返封装进一个对象中;
- 你查 only 内的数据,不管取值多少次,也只会走一次数据库 ;
- 你查的不是 only 内的数据,不会报错也会返回数据,但是会频繁的走数据库
- defer
- 会将不是 defer () 内的所有字段信息全查出来封装进对象中;
- 你查询 () 内的字段会频繁的走数据库,对手库 python 的压力比较大,反之只走一次库
- only
- select_related 与 prefetch_related
- select_related
- 会将括号内外键字段所关联的那张表直接全部拿过来 (可以一次性拿多张表) 跟当前表拼接操作;
- 从而降低你跨表查询 数据库的压力;
select_related括号只能放外键字段(一对一、一对多)
。
- prefetch_related
- 不主动连表操作 (但是内部给你的感觉像是连表操作了);
- 会将 book 表中的 publish_id 全部拿来;
- 再去 publish 表中将 id 对应的所有的数据取出。
- 区别:
- select_related 需要连表,但只走一次数据库;连表会花时间
- prefech_related 不用连表,括号内有几个外键字段 就会走几次数据库查询操作
- select_related
评论区