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

相关推荐
waterHBO4 分钟前
人脸识别,使用 deepface + api + flask, 改写 + 调试
后端·python·flask
冬瓜的编程笔记7 分钟前
【MySQL成神之路】MySQL插入、删除、更新操作汇总
数据库·mysql
Asus.Blogs10 分钟前
Go 语言中的 Struct Tag 的用法详解
开发语言·后端·golang
闪电麦坤9512 分钟前
SQL:窗口函数(Window Functions)
数据库·sql
简单点了18 分钟前
SQL概述和定义
数据库·sql
听风吹雨yu21 分钟前
UV-python环境管理工具 入门教程
开发语言·python·uv
眠修30 分钟前
MySQL 故障排查与生产环境优化
数据库·mysql
y_f_630 分钟前
etcd基础
数据库·etcd
苏苏susuus30 分钟前
python:基础爬虫、搭建简易网站
开发语言·爬虫·python
tqs_1234532 分钟前
idea添加jar包
java·ide·python·pycharm