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)的主要内容,如果未能解决你的问题,请参考以下文章

具有任意数量输入通道(超过 RGB)的卷积神经网络架构

Django - 将列表转换为 Q 对象的组合 OR 的正确方法 [重复]

使用 django 模板呈现可变数量的文本字段/输入对

在 Python 中使用自定义距离函数对任意对象进行聚类

如何使用 Django Querysets 和 Q() 与相同模型类型的对象进行比较?

当多个输入可以为空时,在 Django 中使用 Q 进行过滤