2009-10-23 3 views
2

Mes aventures avec des groupes d'entités se poursuivent après un début légèrement embarrassant (voir Under some circumstances an App Engine get_by_key_name call using an existing key_name returns None).Obtention d'une liste d'entités enfants dans App Engine à l'aide de get_by_key_name (Python)

Je vois maintenant que je ne peux pas faire un appel get_by_key_name normal sur une liste d'entités pour des entités enfants qui ont plus d'une entité parente. Comme les docs modèles disent,

entités multiples demandé par un (get_by_key_name) appel doivent tous avoir le même parent.

J'ai pris l'habitude de faire quelque chose comme ce qui suit:

# Model just has the basic properties 
entities = Model.get_by_key_name(key_names) 
# ContentModel has all the text and blob properties for Model 
content_entities = ContentModel.get_by_key_name(content_key_names) 

for entity, content_entity in zip(entities, content_entities): 
# do some stuff 

Maintenant que les entités ContentModel sont des enfants des entités du modèle, cela ne fonctionnera pas à cause de l'exigence monoparental. Un moyen facile d'activer le scénario ci-dessus avec des groupes d'entités est de pouvoir passer une liste de parents à un appel get_by_key_name, mais je suppose qu'il y a une bonne raison pour laquelle cela n'est pas possible actuellement. Je me demande si c'est une règle dure (comme il n'y a absolument aucun moyen qu'un tel appel puisse fonctionner) ou si le module db pourrait être modifié pour que ce type d'appel fonctionne, même si cela signifiait une plus grande CPU frais.

J'aimerais aussi vraiment voir comment les autres accomplissent ce genre de tâche. Je peux penser à un tas de façons de le gérer, comme l'utilisation des requêtes GQL, mais aucune ne peut penser à l'approche de la performance d'un appel get_by_key_name.

Répondre

4

Créez simplement une liste de clés et faites-en l'acquisition. Notez que je suppose que le nom de clé pour chaque entité ContentModel est le même que son modèle parent. (Pour une relation 1: 1, il est logique de réutiliser le nom_clé.)

+0

Bonne idée. Je n'utilise pas assez de db.Key.from_path. – jamtoday

+0

Vous pourriez être intéressé par cette [proposition de la pile-échange] (http://area51.stackexchange.com/proposals/11464/code-review?referrer=aWNm_PdciyFqjFW8CUacGw2 "revue de code"). Il est presque prêt à commencer la bêta, il en faut juste un peu plus. – greatwolf

1

Je suis gêné de dire que la restriction ('doit être dans le même groupe d'entités') ne s'applique plus dans ce cas. S'il vous plaît ne hésitez pas à file un bug de la documentation!

Dans tous les cas, get_by_key_name n'est que du sucre syntaxique pour get, comme l'illustre Bill Katz. Vous pouvez aller un peu plus loin, même, et utiliser db.get sur une liste de touches pour tout obtenir en une fois - db.get ne se soucie pas du type de modèle.

+0

Si vous obtenez plusieurs entités enfants et tentez de passer une liste pour parent, elle renvoie une erreur BadArgumentError car elle n'acceptera pas de liste de clés. Donc, sauf si vous pouvez passer une liste de clés parentes, il semble que la restriction est toujours en place. – jamtoday

+0

Une liste pour parent? Non, cela ne fonctionnera évidemment pas - vous devez construire des objets clés et utiliser db.get() sur eux. Je ne savais pas que vous essayiez d'obtenir des entités enfants. –

Questions connexes