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

相关推荐
程序员小远3 分钟前
接口测试和单元测试详解
自动化测试·软件测试·python·测试工具·单元测试·测试用例·接口测试
Tech Synapse12 分钟前
电商商品推荐系统实战:基于TensorFlow Recommenders构建智能推荐引擎
人工智能·python·tensorflow
聿小翼15 分钟前
selenium-wire 与 googletrans 的爱恨情仇
python
咖啡调调。18 分钟前
模板引擎语法-算术运算
python·django·sqlite
TE-茶叶蛋18 分钟前
Redis 原子操作
数据库·redis·缓存
CodeCraft Studio18 分钟前
Excel处理控件Spire.XLS系列教程:Java设置Excel活动工作表或活动单元格
java·python·excel
Doker 多克19 分钟前
Python-Django系列—部件
开发语言·python
Linux运维老纪21 分钟前
Python文件操作及数据库交互(Python File Manipulation and Database Interaction)
linux·服务器·数据库·python·云计算·运维开发
Bruce_Liuxiaowei26 分钟前
MCP Python SDK构建的**SQLite浏览器**的完整操作指南
数据库·python·sqlite
q_q王27 分钟前
实时数字人——DH_LIVE
python·大模型·数字人·实时