【问题标题】:Django: Dynamic filtering (OR & AND) using Q objects for arbitrary number of inputDjango:使用 Q 对象对任意数量的输入进行动态过滤(OR & AND)
【发布时间】: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”告终

感谢任何帮助。

【问题讨论】:

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


    【解决方案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()]) + ']'))
    

    【讨论】:

      猜你喜欢
      • 2012-12-16
      • 2017-02-11
      • 2012-10-16
      • 2010-12-29
      • 2018-08-18
      • 2021-09-15
      • 1970-01-01
      • 2014-08-01
      • 2023-03-19
      相关资源
      最近更新 更多