【一日一技】Django不定项数的“或查询”

简介: 【一日一技】Django不定项数的“或查询”

Django

在Django中,假设有一个Model名叫Product,它有一个字段叫做description,类型对应MySQL的Text

如果要对它进行查询,多个条件同时满足,相对比较简单。例如,我希望查询:description字段同时包含关键字促销, 打折, 限时

from django.db.models import Q
item = Product.objects.filter(Q(description__contains='促销') & Q(description__contains='打折') & Q(description__contains='限时'))

如果这些关键词是通过一个列表传进来的,但是我并不知道里面有哪些关键字,也不知道有几个关键字,那么还可以使用链式查询:

item = Product.objects
for keyword in keywords:
    item = item.filter(description__contains=keyword)

循环结束以后,item就是同时满足所有关键字的搜索对象了。对于同一张表,上面两种写法是等效的。


那么问题来了,查询很好写,查询呢?

例如,查询Product,找到description字段包含下述关键字的任意一个促销, 打折, 限时的商品。

首先,查询是不能用链式查询的。

如果关键字是确定的,当然你可以这样写:

from django.db.models import Q
item = Product.objects.filter(Q(description__contains='促销') | Q(description__contains='打折') | Q(description__contains='限时'))


如果关键字是从外面传进来的怎么办呢?

如果关键字列表数量恒定,那么你可以这样写:

from django.db.models import Q
keywords = ['促销', '打折', '限时']
item = Product.objects.filter(Q(description__contains=keywords[0]) | Q(description__contains=keywords[1]) | Q(description__contains=keywords[2]))

现在关键字的数量不确定,可能1个,可能3个,可能10个,这个时候怎么办?

此时,就需要把过滤条件单独抽出来进行或操作了:

from django.db.models import Q
keywords = ['促销', '打折', '限时']
item = Product.objects
if keywords:
    filters = Q(description__contains=keywords[0])
    for keyword in keywords[1:]:
        filters |= Q(description__contains=keyword)
    item = item.filter(filters)

print(item.count()) # 此时打印出来的是所有在description字段包含任一关键字的商品总量

使用这种方式,就可以在Django中实现不定项数的或查询了。

目录
相关文章
|
1月前
|
SQL 存储 数据库
Django模型查询与性能调优:告别N+1问题
本文详解Django数据库查询基础与优化技巧,涵盖QuerySet使用、关联查询(一对多/多对多)、N+1查询问题及解决方案(select_related、prefetch_related)、高级查询方法及项目实战中的数据权限控制实现。
118 0
|
8月前
|
SQL 安全 数据库
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
如何在Django中正确使用参数化查询或ORM来避免SQL注入漏洞?
505 77
|
11月前
|
SQL Go 数据库
【速存】深入理解Django ORM:编写高效的数据库查询
【速存】深入理解Django ORM:编写高效的数据库查询
249 0
|
11月前
|
SQL 前端开发 Python
基于python-django的neo4j人民的名义关系图谱查询系统
基于python-django的neo4j人民的名义关系图谱查询系统
160 0
|
SQL 缓存 数据库
10 Django模型 - 模型查询
10 Django模型 - 模型查询
94 0
|
SQL 数据库 Python
Django框架数据库ORM查询操作(6)
【7月更文挑战第6天】```markdown Django ORM常用数据库操作:1) 查询所有数据2) 根据ID查询 3) 精确查询 4) 分页排序
228 1
|
JSON 数据库 数据格式
使用 Django Q 对象构建复杂查询条件
通过本文示例,我们展示了如何使用Django的Q对象来构建复杂的查询条件,以及如何实现分页功能。Q对象的强大之处在于它能够轻松地组合多个查询条件,支持“与”、“或”关系,极大地提高了查询的灵活性和可读性。希望本文对你在实际项目中使用Django ORM构建复杂查询有所帮助。
|
存储 SQL 数据处理
Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解
Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解
|
前端开发 数据库 Python
Python Django项目下的分页和筛选查询
在Django中实现分页功能,视图函数通过`Paginator`处理数据,每页显示10条记录。URL配置支持带参数和不带参数的分页请求。前端模板使用for循环展示分页数据,包括商品信息和状态按钮,并利用分页组件导航。筛选查询视图根据GET请求的`state`参数过滤上架或下架产品,同样实现分页功能。前端添加状态选择下拉框,分页链接携带查询参数`state`确保筛选状态在翻页时保持。
143 0
|
SQL 缓存 数据库
在Python Web开发过程中:数据库与缓存,如何使用ORM(例如Django ORM)执行查询并优化查询性能?
在Python Web开发中,使用ORM如Django ORM能简化数据库操作。为了优化查询性能,可以:选择合适索引,避免N+1查询(利用`select_related`和`prefetch_related`),批量读取数据(`iterator()`),使用缓存,分页查询,适时使用原生SQL,优化数据库配置,定期优化数据库并监控性能。这些策略能提升响应速度和用户体验。
142 0