Я думаю, вам следует добавить оператор break
при добавлении фильтра в запрос, в противном случае вы рискуете выполнить фильтрацию по одному и тому же условию несколько раз.
Глядя на внутренние компоненты метода фильтра, я вижу следующий код, который нужно выполнить для получения списка условий или критериев:
for criterion in list(criterion):
criterion = expression._expression_literal_as_text(criterion)
criterion = self._adapt_clause(criterion, True, True)
if self._criterion is not None:
self._criterion = self._criterion & criterion
else:
self._criterion = criterion
Это означает, что вы можете добавить условие с помощью следующего кода:
@event.listens_for(Query, "before_compile", retval=True)
def before_compile(query):
criterion = query._adapt_clause(criterion, True, True)
for ent in query.column_descriptions:
entity = ent['entity']
if entity is None:
continue
insp = inspect(ent['entity'])
mapper = getattr(insp, 'mapper', None)
if mapper and issubclass(mapper.class_, HasPrivate):
if query._criterion is not None:
query._criterion = criterion & query._criterion
else:
query._criterion = criterion
break
return query