下面将解释django的ORM查询语句的使用,用下面的方式可以直接查询到ORM,解析的结果
print(article.query)
tips:在windos环境下,查询排序规则(colltion)默认对大小写不敏感;
而在linux下当设置成排序规则__bin的格式时,是对大小写敏感的;
exact 与 iexact (类似等于)
exact 相当于SQL语句中的等号(=);
iexact 相当于SQL语句中的LIKE,但是是like的精准查找并没有%这样的操作;
contains 与 icontains (是否包含)
测试文章标题为 ABCde
contains英文本意是包含的意思,大小写敏感,判断某个字段是否包含了某个数据
article = Article.objects.filter(title__contains='AB')
解析为
SELECT
`article`.`id` ,
`article`.`title` ,
`article`.`content` ,
`article`.`catagory_id`,
`article`.`user_id`
FROM
`article`
WHERE
`article`.`title`
-- 重点看最后一行
LIKE BINARY %AB%
这样的查询是查不到的 必须是 ABC,这样才能获取到ABCde这样的模糊
icontains 大小写不敏感的匹配查询
article = Article.objects.filter(title__icontains='abc')
解析为和上面相同,但是like的后面是小写的abc ,这样是可以查到标题为 ABCde 的文章:
in (在一定值范围内)
提取那些给定的 field 的值是否在给定的容器中。容器可以为 list 、 tuple 或者任何一个可以迭代的对象,包括 QuerySet 对象。
article = Article.objects.filter(id__in=[3,6])
解析为:
SELECT
`article`.`id` ,
`article`.`title` ,
`article`.`content` ,
`article`.`catagory_id`,
`article`.`user_id`
FROM
`article`
-- 重点看最后一行
WHERE
`article`.`id` IN (3, 6)
gt 与 gte、lt 与 lte (大于,大于等于,小于,小于等于)
gt:某个 field 的值要大于给定的值
rticles = Article.objects.filter(id__gt=3)
解析为:
SELECT
`article`.`id` ,
`article`.`title` ,
`article`.`content` ,
`article`.`catagory_id`,
`article`.`user_id`
FROM
`article`
-- 重点看最后一行
WHERE
`article`.`id` > 5
以下用法同上。
gte:大于等于
lt:小于
lte:小于等于
startswith 与 endswith (开始像什么,结束像什么)
startswith:
判断某个字段的值是否是以某个值开始。大小写敏感。示例代码如下:
article = Article.objects.filter(content__startswith="crate")
解析为:
SELECT
`article`.`id` ,
`article`.`title` ,
`article`.`content` ,
`article`.`catagory_id`,
`article`.`user_id`
FROM
`article`
WHERE
`article`.`content`
-- 重点看最后一行
LIKE BINARY crate%
endswith:
同startwith一样的功能,不同的是以什么什么字段结尾的:
解析为:
SELECT
`article`.`id` ,
`article`.`title` ,
`article`.`content` ,
`article`.`catagory_id`,
`article`.`user_id`
FROM
`article`
WHERE
`article`.`content` LIKE BINARY %time
istartswith:
类似于 startswith ,大小写不敏感。
iendswith:
类似于 endswith ,大小写不敏感。
range( 查找范围)
判断某个 field 的值是否在给定的区间中
article = Article.objects.filter(pk__range=(3,6))
解析为:
SELECT
`article`.`id` ,
`article`.`title` ,
`article`.`content` ,
`article`.`catagory_id`,
`article`.`user_id`
FROM
`article`
WHERE
`article`.`id` BETWEEN 3 AND 6
date、time、year、week_day( 日期/时间)
根据年份进行查找。示例代码如下:
article = Article.objects.filter(create_time__year=2020)
解析为:
SELECT
`article`.`id` ,
`article`.`title` ,
`article`.`content` ,
`article`.`catagory_id`,
`article`.`user_id` ,
`article`.`create_time`
FROM
`article`
WHERE
create_time between '2020-01-01' and '2020-12-31'
也可以写成这样的带大于小于的
article = Article.objects.filter(create_time__year__gte=2019)
month:
同 year ,根据月份进行查找。
day:
同 year ,根据日期进行查找。
week_day:
根据星期几进行查找。1表示星期天,7表示星期六, 2-6 代表的是星期一到星期五
time:
根据时间进行查找
order_by (根据字段进行排序)
order_by:指定将查询的结果根据某个字段进行排序。如果要倒叙排序,那么可以在这个字段的前面加一个负号。示例代码如下:
# 按时间正序,类似 asc
orders = BookOrder.objects.order_by("create_time")
# 按时间倒序,类似 desc
orders = BookOrder.objects.order_by("-create_time")
# 时间倒序,如果时间相同再按照价格正序排:
orders = BookOrder.objects.order_by("-create_time", "price")
不要写成如下格式:
orders = BookOrder.objects.order_by("-create_time").order_by("price"))
ORM聚合函数详解
Avg (平均值)
Avg :求平均值。比如想要获取所有物品的价格平均值,这里需要引入一个聚合函数(aggregate)
这里是拿书的价格的例子进行说明:
book_price_avg = Book.objects.aggregate(Avg('price'))
默认打印出来的是{“price__avg”:99.0},可以自定义打印信息,如下:
book_price_avg = Book.objects.aggregate(avgs=Avg('price'))
打印结果为:{“avgs”:99.0}
Count (总数)
Count :获取指定的对象的个数。示例代码如下:
article = Article.objects.aggregate(count=Count("id"))
Count 类中,还有另外一个参数叫做 distinct ,默认是等于 False ,如果是等于 True ,那么将去掉那些重复的值。比如要获取文章列表中所有的不重复的文章标题共有多少个,那么可以
通过以下代码来实现:
result = Author.objects.aggregate(count=Count('title',distinct=True))
Max 与 Min
Max 和 Min :获取指定对象的最大值和最小值
比如想要获取 Author 表中,最大的年龄和最小的年龄分别是多少。那么可以通过以下代码来实现:
result = Author.objects.aggregate(Max('age'),Min('age'))
Sum
Sum :求指定对象的总和。比如要求图书的销售总额。那么可以使用以下代码实现:
price_sum = Author.objects.aggregate(Sum(price)))
QuerySet API详解
get (查找某个字段的值)
根据指定的条件进行查找,不能返回多条数据
result = Article.objects.get(title__icontains="书")
输入参数:
get 的参数只能是 model 中定义的那些字段,只支持严格匹配
filter的参数可以是字段,也可以是扩展的where查询关键字,如in,like等
返回值:
get 返回值是一个ROM对象
filter 返回值是一个QuerySet对象,然后可以对QuerySet在进行查询返回新的QuerySet对象,支持链式操作。QuerySet一个集合对象,可使用迭代或者遍历,切片等,但是不等于list类型
异常:
get 只有一条记录返回的时候才正常,也就说明get的查询字段必须是主键或者唯一约束的字段。当返回多条记录或者是没有找到记录的时候都会抛出异常。
filter有没有匹配记录都可以。
create (创建数据并保存)
create :创建一条数据,并且保存到数据库中。这个方法相当于先用指定的模型创建一个对象,然后再调用这个对象的 save 方法。示例代码如下:
article = Article(title='abc',content="文章内容")
article.save()
# 下面这行代码相当于以上两行代码
article = Article.objects.create(title='abc',content="文章内容")
get_or_create (查找如果没有则创建)
get_or_create根据某个条件进行查找,如果找到了那么就返回这条数据,如果没有查找到,那么就创建一个。示例代码如下:
obj,created= Category.objects.get_or_create(title='默认分类')
如果有标题等于 默认分类 的分类,那么就会查找出来,如果没有,则会创建并且存储到数据库中。
filter(满足条件返回结果)
exclude (将满足条件的结果过滤掉)
all() (返回所有的对象)
first (获取第一条数据)
latest (获取最后一条数据)
delete (删除数据)
update (更新数据)
exists (数据是否存在)
values (获取每行数据为字典格式)
values_list(获取每行数据为元祖)
bulk_create(批量插入)
update_or_create(如果存在,则更新,否则,创建)
defer (过滤掉不需要的字段)
only (提取某些字段)