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" остается одинаковым для всех, и вход может иметь произвольное количество элементов в указанной комбинации.
Я пытался рекурсивно объединиться, используя & и | оператор на Q(), а также попытался построить фильтры, используя функцию Reduce. Но я всегда получаю ошибку "ValueError: слишком много значений для распаковки"
Любая помощь приветствуется.
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()]) + ']'))