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
相关产品推荐
相关产品推荐

