Django - был отфильтрован набор запросов по некоторым параметрам или нет - PullRequest
0 голосов
/ 28 сентября 2018

Вопрос касается фреймворка python - django и, вероятно, опытных разработчиков django.Погуглил его некоторое время, также искал в самом наборе запросов django, но ответа не получил.Можно ли узнать, был ли отфильтрован набор запросов и, если да, получить ключевое значение отфильтрованных параметров?Я занимаюсь разработкой веб-системы с огромным набором фильтров, и я должен заранее определить поведение некоторых пользователей, если бы затронули некоторые фильтры.

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018

Да , но, насколько мне известно, это не задокументировано, вы, вероятно, должны не использовать его.Кроме того, для меня это выглядит как плохой дизайн, если вам нужно получить это из QuerySet.

. Для QuerySet, например qs, вы можете получить атрибут .query, а затем запроситьдля атрибута .where. истинность этого атрибута проверяет, есть ли у этого узла (этот атрибут WhereNode, который является узлом в синтаксисе запроса) дочерние элементы (тогда эти дочерние элементы являются отдельными условиями WHERE или группами такихусловия), следовательно, была проведена некоторая фильтрация.

Так, например:

qs = Model.objects.all()
bool(qs.query.where)   # --> False

qs = Model.objects.filter(foo='bar')
bool(qs.query.where)   # --> True

Если вы осмотрите WhereNode, вы сможете увидеть элементы, из которых он состоит, например,:

>>> qs.query.where
<WhereNode: (AND: <django.db.models.lookups.Exact object at 0x7f2c55615160>)>

и, взглянув на детей, мы даже можем получить подробности:

>>> qs.query.where.children[0]
>>> c1.lhs
Col(app_model, app.Model.foo)
>>> c1.lookup_name
'exact'
>>> c1.rhs
'bar'

Но обозначения довольно загадочные.Кроме того, WhereNode сам по себе не является конъюнктивным (AND), он также может быть дизъюнктивным (OR), и не говорится, что будет выполняться любая фильтрация (поскольку тесты могут быть тривиальнымибыть правдой, как 1 > 0).Таким образом, мы только запрашиваем, если в запросе SQL будет непустой WHERE.Не будет ли этот запрос каким-либо образом ограничивать набор запросов (хотя вы, конечно, можете проверить WhereNode и посмотреть, так ли это).

Обратите внимание, что некоторые ограничения не являются частью WHERE, дляНапример, если вы сделаете JOIN, вы выполните ON, но это не предложение WHERE.

Поскольку, однако, вышеизложенное, насколько мне известно, не задокументировановероятно, не стоит полагаться на это, поскольку это означает, что оно может легко измениться и, следовательно, перестать работать.

0 голосов
/ 06 ноября 2018

Я согласен с Виллемом Ван Онсеном в том, что доступ к внутренним объектам объекта запроса не гарантируется в будущем.Пока это правильно, но может измениться.

Но, пройдя полпути по этому пути, вы можете использовать следующее:

is_filtered_query = bool(' WHERE ' in str(queryset.query))

, которое в значительной степени выполнит эту работу!

0 голосов
/ 28 сентября 2018

Вы можете использовать атрибут query (то есть queryset.query), чтобы получить данные, используемые в запросе SQL (вывод не совсем корректный SQL).

Вы также можете использовать queryset.query.__dict__чтобы получить эти данные в формате словаря.

...