J'ai créé un formulaire de recherche de style bibliothèque (où vous pouvez ajouter de nouvelles lignes à votre recherche, avec des mots de liaison comme ET, OU, ET NON, OU NON) pour leur permettre de construire des états de recherche dans la forme, que j'ai ensuite essayé de transformer en un filtre Q. Pour une raison quelconque, le filtre que je génère semble retourner tout s'il y a un OU. (Par 'ou dans' je veux dire que l'utilisateur a choisi ou comme leur déclaration).filtre Django Q ne fonctionne pas comme prévu
Exemple: Je voulais créer un filtre Q pour que j'obtenir des objets avec son nom à son champ de données et d'essai comme sa valeur ou avec matériel comme datafield et de l'acier comme sa valeur.
Lorsque j'imprime le Q créé, voici ce que je reçois:
(AND: (OR: (AND:), (AND: ('value__icontains', 'Test'), ('represents__exact', <DataField: 3-Name>)), (NOT (AND: ('value__iexact', 'Steel'), ('represents__exact', <DataField: 6-Materials>)))))
lecture de cette déclaration, il semble que cela devrait fonctionner, mais il ne le fait pas et semble revenir tout simplement.
Ce n'est pas exactement ce que j'ai, mais il est un exemple de ce que la forme ressemble à:
MISE À JOUR: J'ai changé mon code afin que la déclaration Q résultante est ceci:
(OR: (AND: ('value__icontains', 'er'), ('represents__exact', <DataField: 3-Name>)), (NOT (AND: ('value__iexact', 'er'), ('represents__exact', <DataField: 5-Keywords>))))
Ou, sous forme expansée:
(OR:
(AND:
('value__icontains', 'er'), ('represents__exact', <DataField: 3-Name>)
),
(NOT
(AND:
('value__iexact', 'er'), ('represents__exact', <DataField: 5-Keywords>)
)
)
)
encore, les impressions de code suivant sur tout dans la base de données:
filtered = objects.filter(q)
print("Filtered: ", filtered)
Est-ce une et sans une seconde expression causer un problème? –
AND est une expression binaire. Donc, il faut 2 expressions. Je ne sais pas comment * exactement * django gère le code en ce moment dans votre cas – karthikr
Je pense que je fixe le problème que vous avez décrit, mais il ne fonctionne toujours pas (voir ma question pour la mise à jour) est –