django 默认查询条件_Django数据库-ORM查询条件

下面将解释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 (提取某些字段)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Django ORM 中,可以使用一些特殊的查询条件来过滤日期和时间类型的数据。下面是一些常用的查询条件: 1. `date`:筛选出指定日期的数据。 示例代码: ``` from datetime import date from myapp.models import MyModel MyModel.objects.filter(date_field=date.today()) ``` 2. `time`:筛选出指定时间的数据。 示例代码: ``` from datetime import time from myapp.models import MyModel MyModel.objects.filter(time_field=time(hour=9, minute=0)) ``` 3. `year`:筛选出指定年份的数据。 示例代码: ``` from myapp.models import MyModel MyModel.objects.filter(date_field__year=2021) ``` 4. `month`:筛选出指定月份的数据。 示例代码: ``` from myapp.models import MyModel MyModel.objects.filter(date_field__month=9) ``` 5. `day`:筛选出指定日期的数据。 示例代码: ``` from myapp.models import MyModel MyModel.objects.filter(date_field__day=15) ``` 6. `week_day`:筛选出指定星期几的数据,星期一为1,星期天为7。 示例代码: ``` from myapp.models import MyModel MyModel.objects.filter(date_field__week_day=1) ``` 除了以上的查询条件,还可以使用 `__range` 来筛选一段时间范围内的数据。例如: ``` from datetime import date from myapp.models import MyModel start_date = date(2021, 9, 1) end_date = date(2021, 9, 30) MyModel.objects.filter(date_field__range=(start_date, end_date)) ``` 以上是一些常用的查询条件,更多查询条件可以查阅 Django 官方文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值