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