Django:使用Q对象进行任意数量输入的动态过滤(OR& AND)

时间:2014-03-08 00:56:43

标签: django python-2.7 django-models django-q

假设输入为,

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'对所有人保持相同,输入可以在指定的组合中具有任意数量的元素。

我试图使用& amp;和|运算符在Q()上,并尝试使用reduce函数构建过滤器。但我总是错误地将“ValueError:太多的值解包”

感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我不确定为什么链接'|'和'&'运算符与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()]) + ']'))