2012-06-18 2 views
0

J'ai un problème en utilisant des requêtes qui utilisent plus d'un filtre (j'utilise NDB à la place DB):Comment filtrer plus d'une propriété dans Google App Engine? (Python)

... 
foo = something.query(something.a==5, something.b<8, something.c<3).order(something.b).fetch(1) 
... 

Je reçois cette erreur:

Only one inequality filter per query is supported. 

je pouvais résoudre ce problème en utilisant quelque chose comme ceci:

... 
foo = something.query(something.a==5, something.b<8).order(something.b).fetch() 
#loop through each one of those rows and add those who have foo.c<3 to some array 

mais cette solution n'est pas vraiment géniale. Est-ce que quelqu'un a une meilleure idée?

Merci

Répondre

1

Voici comment je l'ai résolu:

foo = something.query(ndb.query.AND(something.a==5, something.b<8, ndb.query.OR(something.c==1, something.c==2))) 
+3

Clever. Vous pouvez simplifier ceci à: something.query (quelque chose.a == 5, quelque chose.b <8, quelque chose.c.IN ([1, 2])): vous obtenez le niveau AND le plus élevé gratuitement, et IN est un implicite OU sur la même propriété et des valeurs différentes. Mais en général la restriction elle-même reste - vous ne pouvez pas utiliser <, <=, >,> = ou! = Sur plus d'une propriété dans la même requête. (! = se traduit par < OR >.) –

+0

Cela ne résout cependant pas le problème général - et si vous vouliez quelque chose.c <100? – user1357607

+1

@GuidovanRossum Et si quelque chose.c est un flotteur? Comme dans ce cas [comparaisons d'inégalités multiples] (http://stackoverflow.com/questions/34980755/ndb-multi-inequality-comparision-join-multi-queries-cursors-python-googl). Pourriez-vous s'il vous plaît m'aider avec cela? –

1

Vous devez utiliser le query.AND or query.OR:

qry = Article.query(query.AND(Article.tags == 'python', 
           query.OR(Article.tags.IN(['ruby', 'jruby']), 
             query.AND(Article.tags == 'php', 
               Article.tags != 'perl')))) 
+0

J'ai la même erreur. J'utilise plus d'une propriété. Dans votre exemple, vous n'utilisez que des balises, mais j'ai besoin d'utiliser a, b, c. – Vizualni

+0

@Vizualni vous pouvez ajouter ce que vous aimez à la place l'un des '.tags' dans l'exemple actuel ... – Lipis

+0

@ Lipis Je sais que monsieur :). J'ai changé cela pour travailler avec mon application, mais j'ai eu la même erreur. C'est le problème qui me dérange. [Restriction sur les requêtes] (https://developers.google.com/appengine/docs/python/datastore/queries#Restrictions_on_Queries) – Vizualni

2

j'ai eu un problème lié, et j'ai utilisé un ComputedProperty pour résoudre il. Par exemple, vous pourriez avoir un objet ComputedProperty (self lambda: self.b < 8 et self.c < 3) et ensuite demander simplement si ce ComputedProperty est vrai.

Questions connexes