Да , но, насколько мне известно, это не задокументировано, вы, вероятно, должны не использовать его.Кроме того, для меня это выглядит как плохой дизайн, если вам нужно получить это из 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
.
Поскольку, однако, вышеизложенное, насколько мне известно, не задокументировановероятно, не стоит полагаться на это, поскольку это означает, что оно может легко измениться и, следовательно, перестать работать.