1

假设输入是,

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:要解压的值太多”而告终

任何帮助表示赞赏。

4

1 回答 1

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()]) + ']'))
于 2014-03-08T03:13:28.050 回答