Краткий ответ : Если вы не сдадите _connector
самостоятельно.В результате Django будет использовать 'AND'
в качестве соединителя.
A Q
объект является подклассом tree.Node
.Действительно, мы можем проверить исходный код [GitHub] :
class Q(tree.Node):
"""
Encapsulate filters as objects that can then be combined logically (using
`&` and `|`).
"""
# Connection types
AND = 'AND'
OR = 'OR'
<b>default = AND</b>
conditional = True
def __init__(self, *args, <b>_connector=None</b>, _negated=False, **kwargs):
super().__init__(children=[*args, *sorted(kwargs.items())], connector=<b>_connector</b>, negated=_negated)
# …
Когда мы, таким образом, создаем объект Q
, мы делаем супер-вызов к tree.Node
конструктор данных, и если мы не передадим _connector
, он будет принимать None
в качестве значения.
Сам Node
, однако, примет значение по умолчанию в случае истинности connector
это None
.Действительно, если мы посмотрим на исходный код Node
[GitHub] , мы увидим:
class Node:
"""
A single internal node in the tree graph. A Node should be viewed as a
connection (the root) with the children being either leaf nodes or other
Node instances.
"""
# Standard connector type. Clients usually won't use this at all and
# subclasses will usually override the value.
default = 'DEFAULT'
def __init__(self, children=None, connector=None, negated=False):
"""Construct a new Node. If no connector is given, use the default."""
self.children = children[:] if children else []
<b>self.connector = connector or self.default</b>
self.negated = negated
# …
Это означает, чточто если вы создаете объект Q
, соединителем по умолчанию является значение Q.AND
и, таким образом, 'AND'
.