Я добавляю функции отчетности в веб-приложение django, которое включает возможность цепочки фильтров при определении логики, например, (1 OR 2 OR 4) AND 4
В настоящее время используется структура данных:
`{'logic': u'(1 OR 2 OR 4) AND 4',
'query': [{u'field': u'first_name',
u'id': 1,
u'opertor': u'icontains',
u'value': u'A'},
{u'field': u'first_name',
u'id': 2,
u'opertor': u'icontains',
u'value': u'b'},
{u'field': u'show_tag',
u'id': 3,
u'opertor': u'includes',
u'value': u'1955'},
{u'field': u'organisation__organisation_name',
u'id': 4,
u'opertor': u'icontains',
u'value': u'a'}]}`
Чтобы преобразовать логику из строки во вложенный список, я использую следующее:
from pyparsing import nestedExpr
def parse_brackets(val):
val = '(' + val + ')'
parsed = nestedExpr('(',')').parseString(val).asList()
return parsed
Для приведенного выше примера это возвращает [[['1', 'OR', '2', 'OR', '4'], 'AND', '4']]
Мне сложно разобрать эту структуру данных, чтобы она могла быть преобразована в Q()
цепочечные объекты. Я пытался использовать BFS для поиска по структуре, но не могу правильно сопоставить AND / OR с окружающими критериями
Любой совет с благодарностью!