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()]) + ']'))
Другие вопросы по тегам