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

相关推荐
漫天转悠7 分钟前
MySQL 中字符类型长度为什么推荐 2 的次方数大小?
数据库·mysql
漫天转悠11 分钟前
MySQL的DELETE(删除数据)详解
数据库·mysql
无敌岩雀25 分钟前
深入探讨 Redis 持久化机制:原理、配置与优化策略
数据库·redis
NiJiMingCheng37 分钟前
Python爬取豆瓣电影全部分类数据并存入数据库
数据库·数据仓库·python·网络爬虫
NullPointerExpection37 分钟前
使用 pycharm 新建使用 conda 虚拟 python 环境的工程
python·pycharm·conda
我是水怪的哥43 分钟前
python安装包中的一些问题(一):conda list 已经安装的包为啥在spyder pip list中没有?
开发语言·windows·python
禾乃儿_xiuer1 小时前
《用Python实现3D动态旋转爱心模型》
开发语言·python·3d·pygame·表白·爱心代码·初学者
Leo Han1 小时前
Spring中实现动态数据源切换,基于AbstractRoutingDataSource
java·数据库·spring
lx学习1 小时前
Python学习35天
开发语言·python·学习
捂月1 小时前
spring boot有哪些不足之处?
数据库·spring boot·sql