0

Disons que j'ai un modèle:requête NDB avec projection sur un attribut utilisé dans .IN()

class Pet(ndb.Model): 
    age = ndb.IntegerProperty(indexed=False) 
    name = ndb.StringProperty(indexed=True) 
    owner = ndb.KeyProperty(indexed=True) 

Et j'ai une liste des clés nommées owners. Pour faire une requête pour Pet s que je ferais:

pets = Pets.query(Pets.owner.IN(owners)).fetch() 

Le problème est que cette requête renvoie toute l'entité.

Comment puis-je faire une requête projetée et obtenir juste le propriétaire et le nom?

Ou comment structurer les données pour obtenir simplement le nom et le propriétaire.

Je peux faire une projection pour le name mais je perds la référence de l'animal de compagnie au propriétaire. Et owner ne peut pas être dans la projection.

+0

Il retourne toujours toute l'entité (objet) par la conception – voscausa

+0

S'il vous plaît préciser votre question pour moi, parce que si vous avez une liste de keys.You peut appeler ' (clé) .get() 'et et il apportera' l'entité' que vous choisirez la propriété que vous voulez. Également aller chercher une entité par clé est gratuit dans le moteur de l'application !! – Xenolion

Répondre

0

Comme vous l'avez remarqué, vous ne pouvez pas le faire avec le contexte exact que vous avez mentionné, parce que vous avez frappé l'un des Limitations on projections:

  • Propriétés référencées dans une égalité (=) ou l'adhésion (IN) ne peut pas être projeté.

Depuis owner est utilisé dans un filtre IN il ne peut pas être projeté. Puisque vous avez besoin du owner et que vous ne pouvez pas le projeter, vous devrez laisser tomber la projection et ainsi vous obtiendrez toujours l'entité entière.

Une alternative serait de diviser votre entité en 2 entités homologues, toujours en relation 1: 1, en utilisant les mêmes identifiants d'entité:

class PetA(ndb.Model): 
    name = ndb.StringProperty(indexed=True) 
    owner = ndb.KeyProperty(indexed=True) 

class PetB(ndb.Model): 
    age = ndb.IntegerProperty(indexed=False) 

De cette façon, vous pouvez faire la même requête, sauf PetA type au lieu de l'original Pet et le résultat que vous obtiendriez serait l'équivalent de la requête de projection d'origine que vous cherchiez.

Malheureusement cela ne fonctionnera qu'avec une ou très peu de requêtes de projection de ce type pour la même entité, sinon vous auriez besoin de diviser l'entité en trop grand nombre. Donc, vous devrez peut-être faire des compromis.

Vous pouvez trouver plus de détails sur la scission de l'entité dans re-using an entity's ID for other entities of different kinds - sane idea?

+0

Hmm, idée intéressante. Merci. Mais si l'animal ne contient que les données dont vous avez besoin, diriez-vous que c'est une bonne idée de n'indexer que le 'propriétaire'? Le nom n'est pas nécessaire, n'est-ce pas? Aucune requête pour le nom –

+0

L'indexation 'name' n'est nécessaire que si vous voulez filtrer ou trier les résultats de votre requête par' name'. –