Вероятно, у вас уже есть догадка о том, что это такое - вы отдаете его в первом предложении
... большое, сложное приложение ...
blockquote>Похоже, что у вас где-то есть утечка ресурсов GDI. Чтобы подтвердить это, попробуйте найти в диспетчере задач объекты GDI для вашего процесса. В какой-то момент большинство операций GDI не будет выполнено для вашего приложения.
Убедитесь, что вы правильно освобождаете все дескрипторы. Обратите внимание, что для разных объектов GDI требуются разные способы освобождения объекта. Например,
GetDC
освобождаетсяReleaseDC
, ноCreateDC
освобождаетсяDeleteDC
.Вот почему интеллектуальные объекты RAII (например, интеллектуальные указатели) рекомендуются для управления ресурсами на C ++ (где освобождение управляется интеллектуальным объектом, чтобы уменьшить вероятность утечек и ошибок).
Вы можете использовать функцию, которая ищет оператор 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
объект, который вам нужен.
Отказ от ответственности: я не проверял этот код.