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

Django中动态构建多条件OR查询(LIKE匹配场景)

Django实现动态多条件OR查询(适配未知数量输入)

核心思路

利用Django的Q对象,通过循环生成对应字段的查询条件,再用|运算符将所有条件动态组合成OR逻辑,最后与固定查询条件结合完成过滤。

实现代码

假设用户输入的类型列表为user_genres,完整代码如下:

from django.db.models import Q

# 用户输入的类型列表(数量不固定)
user_genres = ["Action", "Comedy", "Horror"]

# 初始化Q对象
genre_conditions = Q()
# 循环生成OR条件
for genre in user_genres:
    genre_conditions |= Q(genres__icontains=genre)

# 执行查询:OR条件 + 固定条件status=1
series = series_db.objects.filter(genre_conditions, status=1).values('id', 'title')

代码说明

  • 初始化空的Q()对象作为起始条件,每次循环通过|=运算符将新的Q(genres__icontains=genre)条件叠加,最终形成Q1 | Q2 | Q3...的多OR逻辑。
  • 如果user_genres为空列表,genre_conditions会是一个空的Q对象,此时查询会返回所有status=1的数据,若需要避免这种情况,可以添加判断:
    if user_genres:
        genre_conditions = Q()
        for genre in user_genres:
            genre_conditions |= Q(genres__icontains=genre)
        series = series_db.objects.filter(genre_conditions, status=1).values('id', 'title')
    else:
        # 处理空输入的情况,比如返回空集合
        series = series_db.objects.none()
    

对应生成的SQL

当user_genres = ["Action", "Comedy", "Horror"]时,生成的SQL与需求一致:

SELECT id, title FROM movies WHERE (genres LIKE '%Action%' OR genres LIKE '%Comedy%' OR genres LIKE '%Horror%') AND status = 1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 05:52:51