Как значение query.connector устанавливается в объектах Q в коде Django? - PullRequest
3 голосов
/ 28 сентября 2019

Во время разработки django websie я столкнулся с объектами и запросами django Q.

У меня есть код ниже.

Я ссылался на официальную документацию от https://docs.djangoproject.com/en/2.2/topics/db/queries/.

 query = Q()
    if request.POST.get('emp_name') != None:
        query.add(Q(emp_name__icontains=str(request.POST.get('emp_name'))), query.connector)

Я знаю, как работают объекты Query Q, но не могу понять, как определено значение query.connector.

значение query.connector аналогично 'AND', 'OR'.

Мне не удалось получить какие-либо онлайн-ссылки на вышеуказанные проблемы.

1 Ответ

1 голос
/ 28 сентября 2019

Краткий ответ : Если вы не сдадите _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)

    # &hellip;

Когда мы, таким образом, создаем объект 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

    # &hellip;

Это означает, чточто если вы создаете объект Q, соединителем по умолчанию является значение Q.AND и, таким образом, 'AND'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...