Django ORM 模糊查询实例解析

在 Django 中,对象关系映射 (ORM) 系统提供了一种强大而直观的数据库交互方式。本博文将深入探讨 Django ORM 中的高级单表查询方法和模糊查询选项,使开发人员能够高效地检索和操作数据。

模糊查询是一种非常有用的功能,允许我们根据特定条件来过滤数据库中的数据。在本篇博客中,主要介绍几种常见的模糊查询方法,并提供相应的示例代码和查询结果。通过这些示例,我们可以清楚地了解如何在Django中使用模糊查询来过滤数据库中的数据。

一、 带双下划线的模糊查询

1、 价格大于50的书籍

要查询价格大于50的书籍,我们可以使用`filter`方法结合`__gt`(大于)参数来实现。

```

ret = Book.objects.filter(price__gt=50)

查询结果:[<Book: 111>, <Book: linux>, <Book: java>, <Book: 西游记>, <Book: 水浒传>]

```

此查询将返回价格超过 50 的图书。

2、 价格大于等于50的书籍

同样,如果我们需要查询价格大于等于50的书籍,可以使用`__gte`(大于等于)参数。

```

ret = Book.objects.filter(price__gte=50)

查询结果:[<Book: 111>, <Book: linux>, <Book: java>, <Book: 西游记>, <Book: 水浒传>]

```

此查询将返回价格等于或大于 50 的图书。

3、 名称以特定字符串开头的书籍

若要查询名称以特定字符串开头的所有书籍名称,我们可以使用`__startswith`参数。例如,要检索名称以 "li "开头的图书,使用 `__startswith` 操作符:

```

ret = Book.objects.filter(name__startswith="li").values("name")

查询结果:[{'name': 'linux'}]

```

此查询将返回名称以 "li "开头的图书名称。

4、 特定日期范围内的书籍

最后,如果需要查询特定日期范围内的书籍,可以使用`__year`和`__month`参数。例如,要检索 2024 年 2 月出版的图书,使用 `__year` 和 `__month` 操作符:

```

ret = Book.objects.filter(pub_date__year=2024, pub_date__month=2)

查询结果:[<Book: 飘>, <Book: 红楼梦>, <Book: 水浒传>]

```

此查询将检索 2024 年 2 月出版的图书。

5、 大小写不敏感的名称匹配

Django ORM 提供了执行大小写不敏感匹配的模糊查询选项。例如,要检索名称中包含 "li "的书籍,无论大小写如何,可以使用 `__icontains`操作符:

```

ret = Book.objects.filter(name__icontains="li")

```

此查询将以不区分大小写的方式检索名称包含 "li "的图书。

6、 高级模糊匹配

除了大小写不敏感匹配外,Django ORM 还支持使用 `__contains` 操作符进行高级模糊匹配:

```

ret = Book.objects.filter(name__contains="li")

```

此查询将检索名称包含 "li "的图书。

二、代码演示

python 复制代码
############### 模糊查询(双下划线) ##################
def query(request):
    # 查询价格大于50的书籍
    # ret=Book.objects.filter(price__gt=50)
    # SELECT `app01_book`.`id`, `app01_book`.`name`, `app01_book`.`price`, `app01_book`.`pub_date`,
    # `app01_book`.`publish` FROM `app01_book` WHERE `app01_book`.`price` > 50 LIMIT 21
    # print(ret)
    # < QuerySet[ < Book: 111 >, < Book: linux >, < Book: java >, < Book: 西游记 >, < Book: 水浒传 >] >

    # 查询价格大于等于50的书籍
    # ret = Book.objects.filter(price__gte=50)
    # SELECT `app01_book`.`id`, `app01_book`.`name`, `app01_book`.`price`, `app01_book`.`pub_date`,
    # `app01_book`.`publish` FROM `app01_book` WHERE `app01_book`.`price` >= 50 LIMIT 21
    # print(ret)
    # < QuerySet[ < Book: 111 >, < Book: linux >, < Book: java >, < Book: 西游记 >, < Book: 水浒传 >] >

    # 查询名称以li开头的所有书籍名称
    # ret=Book.objects.filter(name__startswith="li").values("name")
    # SELECT `app01_book`.`name` FROM `app01_book` WHERE `app01_book`.`name` LIKE BINARY 'li%' LIMIT 21
    # ret=Book.objects.filter(name__istartswith="li").values("name")
    # __istartswith 不区分大小写
    # ret=Book.objects.filter(name__contains="li").values("name")
    # __contains:包含 , __icontains: 不区分大小写 包含
    # print(ret)
    # < QuerySet[{'name': 'linux'}] >

    # 查询2024年2月的所有书籍
    # ret=Book.objects.filter(pub_date__year=2024,pub_date__month=2)
    # SELECT `app01_book`.`id`, `app01_book`.`name`, `app01_book`.`price`, `app01_book`.`pub_date`,
    # `app01_book`.`publish` FROM `app01_book` WHERE(extract (MONTH  FROM `app01_book`.`pub_date`) = 2
    # AND `app01_book`.`pub_date`  BETWEEN '2024-01-01 00:00:00' AND '2024-12-31 23:59:59.999999') LIMIT 21;
    # print(ret)
    # <QuerySet [<Book: 飘>, <Book: 红楼梦>, <Book: 水浒传>]>

    return HttpResponse("query success")

三、总结

通过利用 Django ORM 中这些先进的单表查询方法和模糊查询选项,可以根据自己的特定需求精确地过滤和检索数据,从而使应用程序更加健壮和高效。

相关推荐
petaexpress3 分钟前
分布式云化数据库的优缺点分析
数据库·分布式
不染_是非10 分钟前
Django学习实战篇六(适合略有基础的新手小白学习)(从0开发项目)
后端·python·学习·django
star数模12 分钟前
2024“华为杯”中国研究生数学建模竞赛(E题)深度剖析_数学建模完整过程+详细思路+代码全解析
python·算法·数学建模
失心疯_202320 分钟前
Mysql_使用简介
数据库·sql·mysql·关系型数据库·ddl·dml·mysql教程
小威要向诸佬学习呀20 分钟前
MySQL中的LIMIT与ORDER BY关键字详解
数据库·mysql
Mero技术博客25 分钟前
第二十节:学习Redis缓存数据库实现增删改查(自学Spring boot 3.x的第五天)
数据库·学习·缓存
跟着大数据和AI去旅行38 分钟前
使用肘部法则确定K-Means中的k值
python·机器学习·kmeans
代码对我眨眼睛42 分钟前
springboot从分层到解耦
spring boot·后端
The Straggling Crow1 小时前
go 战略
开发语言·后端·golang
ai安歌1 小时前
【JavaWeb】利用IDEA2024+tomcat10配置web6.0版本搭建JavaWeb开发项目
java·开发语言·后端·tomcat·web·intellij idea