You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django Queryset中结合__in与__icontains过滤器进行过滤?

Django QuerySet:结合__in与__icontains的实现方法

Django本身没有提供直接将__in和__icontains合并的过滤器,但可以通过Q对象实现「字段包含列表中任意元素」的需求。

具体做法是为列表中的每个元素创建一个field__icontains的Q条件,再用逻辑或(|)将这些条件连接,最后传入filter()方法即可。

举个实际例子:假设我们有Article模型,包含title字段,要筛选出标题包含['abc', 'def']中任意字符串的文章:

from django.db.models import Q
from .models import Article

keywords = ['abc', 'def']
# 构造Q条件集合
conditions = Q()
for keyword in keywords:
    conditions |= Q(title__icontains=keyword)
# 执行查询
articles = Article.objects.filter(conditions)

也可以用更简洁的生成器表达式写法:

conditions = Q(*(Q(title__icontains=kw) for kw in keywords), _connector=Q.OR)
articles = Article.objects.filter(conditions)

这种方式等价于把每个元素的__icontains条件用OR连接,既实现了类似__in的多值匹配逻辑,又保留了__icontains的模糊匹配特性。如果列表元素过多,生成的SQL语句会较长,但在多数业务场景下这种方式高效可行。

内容的提问来源于stack exchange,提问作者cclloyd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 08:07:02