Au cours du développement du site Web Django, je suis tombé sur des objets et des requêtes Django Q.

J'ai le code ci-dessous comme.

J'ai renvoyé la documentation officielle de https://docs.djangoproject.com/en/2.2/topics/db /requêtes/.

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

Je sais comment fonctionnent les objets Query Q, mais je ne peux pas comprendre comment la valeur query.connector est définie.

La valeur de query.connector sera comme 'AND' , 'OU' de même.

Je ne suis pas en mesure d'obtenir des références en ligne pour le type de problème ci-dessus.

4
Aditya 28 sept. 2019 à 11:05

1 réponse

Meilleure réponse

Réponse courte : si vous ne réussissez pas vous-même un _connector. Django finira par utiliser 'AND' comme connecteur.

Un objet Q est une sous-classe de tree.Node. En effet on peut inspecter le code source [GitHub] :

class Q(tree.Node):
    """
    Encapsulate filters as objects that can then be combined logically (using
    `&` and `|`).
    """
    # Connection types
    AND = 'AND'
    OR = 'OR'
    default = AND
    conditional = True

    def __init__(self, *args, _connector=None, _negated=False, **kwargs):
        super().__init__(children=[*args, *sorted(kwargs.items())], connector=_connector, negated=_negated)

    # …

Quand on construit ainsi un objet Q, on fait un super appel au constructeur de données tree.Node, et si on ne passe pas un _connector, il prendra None comme valeur .

Le Node lui-même prendra cependant la valeur par défaut au cas où la véracité du connector est None. En effet, si on regarde le code source de Node [GitHub], on voit :

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 []
        self.connector = connector or self.default
        self.negated = negated

    # …

Cela signifie donc que si vous construisez un objet Q, le connecteur par défaut est la valeur de Q.AND et donc 'AND'.

2
Willem Van Onsem 28 sept. 2019 à 09:26