2017-10-09 18 views
1

Je suis en train d'exécuter une requête que je l'aurais écrit de manière intuitive:Faire un NDB dans la requête avec un tableau

Project.query(Project.project_id IN ("abc","def")).fetch() 

J'ai appris que dans NDB, vous faites ceci:

Project.query(ndb.OR(Project.project_id == "abc", Project.project_id == "def")).fetch() 

Ce que je suis généralement bien, même si c'est un peu plus difficile à lire. Bien que (pour un novice comme moi) je ne comprends pas pourquoi l'interprète ne peut pas faire le dur travail pour vous et accepter/analyser un IN dans un nid de OR == ... mais c'est une question distincte.

Le problème est que ma liste de valeurs acceptables de project_id - dans ce cas "abc", "def" - est dynamique. Avec IN, je peux enrouler ma tête autour de quelque chose comme la liste IN. Avec ces multiples ORs, je suppose que je pourrais itérer sur ma liste et écrire l'instruction chaînée - mais ce serait une chaîne, donc je suppose que ndb ne l'analyserait pas comme une requête valide, et il se sent super inélégant.

Quelle est l'approche canonique ici?

Répondre

2

Le Google doc for IN a cet exemple:

query = Article.query (Article.tags.IN ([ 'python', 'rubis', 'php']))

qui suggère que vous devriez être en mesure de faire:

dynamic_list = ['abc','def','ghi'] 
Project.query(Project.project_id.IN(dynamic_list)) 
+0

Je pensais que les docs disaient que vous deviez l'écrire dans le second style. Si le premier style (plus traditionnel) fonctionne (et c'est le cas), je préfère cela. –