GQL: Pas égal filtre sur une propriété à valeurs multiples
-
24-10-2019 - |
Question
Bricoler un peu avec le datastore GAE j'ai trouvé que je ne peux pas penser une bonne façon de filtrent les résultats en utilisant le filtre de l'inégalité « =! » Sur une propriété à plusieurs valeurs:
class Entry(db.Model):
...
tags = db.StringListProperty()
e1 = Entry()
e2 = Entry()
e1.tags = ['tag1', 'tag2', 'tag3']
e2.tags = ['tag1', 'tag3', 'tag4']
# I want to exclude all the results containing 'tag2'
db.GqlQuery("""SELECT * FROM Entry
WHERE tags != 'tag2' """)
Le problème est que cette requête renvoie à la fois e1 et e2 mais je veux seulement e2 .
Je pense que cela se produit parce que le filtre d'inégalité est évaluée comme ANY (VRAI si au moins une valeur est! = « Tag2 ». Il y a un moyen d'appliquer le filtre à tous? (TRUE si toutes les valeurs sont! = « Tag2 « )?
Je sais que datastore GAE n'est pas relationnel mais je voudrais savoir comment résoudre intelligemment / que ce genre de requêtes.
Merci;)
La solution
J'ai pensé à ce groupe un et je ne pense pas qu'il y ait une bonne façon de le faire (s'il vous plaît me corriger si je me trompe). Ma solution non-intelligente est de ne pas utiliser StringListProperty et en cascade un tas de filtres:
class Entry(db.Model):
...
tag_1 = db.StringProperty();
tag_2 = db.StringProperty();
...
Entry.all().filter('tag_1 !=', tag).filter('tag_2 !=', tag) ...
Je ne vais pas commencer à décrire les problèmes évidents avec cette solution, mais au moins il fait ce que vous voulez.