Краткий ответ:
Нет, вы не можете сделать это.
Длинный ответ:
Теоретически, это может быть возможно (до некоторой степени в любом случае), но определенно не рекомендуется .
(Я не полностью изучил источник django, так что последующее является результатом простого подъема по дереву вызовов.)
Просмотр источника для QuerySet , filter()
и exclude()
возвращают клон самого набора запросов с новым добавленным правилом (с использованием clone.query.add_q()
).
clone.query
- это объект , представляющий SQL-запрос , тогда как метод add_q () добавляет новое правило в clone.query.where
, который по сути является корневым узел дерева .
Способ добавления нового узла в дерево зависит от того, должно ли правило быть связано с предложением AND
или OR
. Это важно, поскольку оно влияет на правильность окончательного SQL-запроса, который генерируется .
Итак, чтобы вывести список фильтров, назначенных набору запросов, один "просто" должен понять, как представляется дерево queryset.query.where
(см. django.utils.tree
).
Сложным является, конечно, удаление фильтров, которые не влияют на остальные правила. Я воздержусь от предложения решения, поскольку нет никакой гарантии, что реализация не изменится, и это сделает решение недействительным. Я подозреваю, что это возможно, но пахнет чем-то, что должно быть сделано только из академического интереса, или не совсем.