2013-07-03 5 views
1

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 à: enter image description here

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) 

Répondre

2

Cela ressemble à un bug dans la façon dont vous générez le jeu de requête.

Réorganisation de l'instruction Q générée, il semble que le AND plus externe n'a pas une deuxième expression.

(AND: 
    (OR: 
     (AND:), 
     (AND: 
      ('value__icontains', 'Test'), 
      ('represents__exact', <DataField: 3-Name>) 
     ), 
     (NOT 
      (AND: 
       ('value__iexact', 'Steel'), 
       ('represents__exact', <DataField: 6-Materials>) 
      ) 
     ) 
    ) 
) 

également le (AND:), vide poserait trop de problèmes, donc faudrait trouver un moyen d'enlever le Q vide objet

PS: Ce n'est pas une réponse complète, mais une direction, parce que sans regarder Au niveau du code, il peut être difficile de déterminer exactement où se trouve le bogue.

+0

Est-ce une et sans une seconde expression causer un problème? –

+0

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

+0

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 –

Questions connexes