Разбор строки, содержащей логику, для создания объектов Django Q

Вероятно, у вас уже есть догадка о том, что это такое - вы отдаете его в первом предложении

... большое, сложное приложение ...

Похоже, что у вас где-то есть утечка ресурсов GDI. Чтобы подтвердить это, попробуйте найти в диспетчере задач объекты GDI для вашего процесса. В какой-то момент большинство операций GDI не будет выполнено для вашего приложения.

Убедитесь, что вы правильно освобождаете все дескрипторы. Обратите внимание, что для разных объектов GDI требуются разные способы освобождения объекта. Например, GetDC освобождается ReleaseDC, но CreateDC освобождается DeleteDC.

Вот почему интеллектуальные объекты RAII (например, интеллектуальные указатели) рекомендуются для управления ресурсами на C ++ (где освобождение управляется интеллектуальным объектом, чтобы уменьшить вероятность утечек и ошибок).

1
задан RBowen 11 March 2019 в 14:23
поделиться

1 ответ

Вы можете использовать функцию, которая ищет оператор OR или AND в заданном списке токенов и нарезает список по индексу, где он найден, и рекурсивно обрабатывает два нарезанных списка с обеих сторон. оператора и примените соответствующие методы (Q.__or__ и Q.__and__) к возвращаемым Q объектам. Если оператор не найден, вернуть новый объект Q со ссылочными данными запроса:

def q(query, tokens):
    if isinstance(tokens, list):
        for operator in ('OR', 'AND'): # OR first since it has a lower precedence than AND
            try:
                index = tokens.index(operator)
                break
            except ValueError:
                pass
        else:
            return q(query, tokens[0])
        return (Q.__or__ if operator == 'OR' else Q.__and__)(
            q(query, tokens[:index]), q(query, tokens[index + 1:]))
    else:
        d = query[int(tokens)]
        return Q(**{'__'.join((d['field'], d['operator'])): d['value']})

, так что с учетом:

tokens = [[['1', 'OR', '2', 'OR', '4'], 'AND', '4']]
query = {'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'}]}
query = {q['id']: q for q in query['query']} # transform the above to a dict indexed by id

q(query, tokens) должен вернуть Q объект, который вам нужен.

Отказ от ответственности: я не проверял этот код.

0
ответ дан blhsing 11 March 2019 в 14:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: