Django:使用 Q 对象对任意数量的输入进行动态过滤(OR & AND)
Posted
技术标签:
【中文标题】Django:使用 Q 对象对任意数量的输入进行动态过滤(OR & AND)【英文标题】:Django: Dynamic filtering (OR & AND) using Q objects for arbitrary number of input 【发布时间】:2014-04-11 09:26:46 【问题描述】:假设输入是,
f = ['f0_0', 'f1_0', 'f1_1', 'f2_0', 'f2_1', 'f2_2']
如何通过以下方式创建查询
model.objects.filter(Q(k = "f0_0"), Q(k = "f1_0") | Q(k = "f1_1"), Q(k = "f2_0") | Q(k = "f2_1") | Q(k = "f2_2"))
其中“k”对所有元素都保持不变,并且输入可以在指定组合中包含任意数量的元素。
我尝试使用 & 和 | 递归链接Q() 上的运算符,还尝试使用 reduce 函数构建过滤器。但我总是以错误“ValueError: too many values to unpack”告终
感谢任何帮助。
【问题讨论】:
【参考方案1】:我不确定为什么要链接“|”和 '&' 运算符不能与 Q() 一起正常工作。但不知何故,通过在字符串上调用 eval 来解决这个问题(看起来是一种解决方法而不是解决方案)
fMap =
for opt in f:
prefix = opt.split('_')[0]
if not prefix in fMap:
fMap[prefix] = 'Q(k="' + opt +'")'
else:
fMap[prefix] += '|Q(k="' + opt +'")'
model.objects.filter(*eval('[' + ','.join([v for k, v in fMap.iteritems()]) + ']'))
【讨论】:
以上是关于Django:使用 Q 对象对任意数量的输入进行动态过滤(OR & AND)的主要内容,如果未能解决你的问题,请参考以下文章
Django - 将列表转换为 Q 对象的组合 OR 的正确方法 [重复]