2009-02-09 17 views
6

Les enfants d'une entité sont-ils disponibles dans une requête?Requête Google App Engine (pas de filtre) pour les enfants d'une entité

Étant donné:

class Factory(db.Model): 
    """ Parent-kind """ 
    name = db.StringProperty() 

class Product(db.Model): 
    """ Child kind, use Product(parent=factory) to make """ 
    @property 
    def factory(self): 
     return self.parent() 
    serial = db.IntegerProperty() 

On suppose 500 usines ont fait 500 produits pour un total de 250.000 produits. Existe-t-il un moyen de créer une requête efficace en ressources qui renvoie uniquement les 500 produits créés par une usine en particulier? La méthode ancêtre est un filtre, donc en utilisant par ex. Product.all(). Ancestor (factory_1) nécessiterait des appels répétés vers le magasin de données.

Répondre

8

Bien que l'ancêtre soit décrit comme un "filtre", il ne fait que mettre à jour la requête pour ajouter la condition ancêtre. Vous n'envoyez pas de requête au magasin de données tant que vous n'avez pas parcouru la requête, ce qui fonctionne correctement.

Un point mineur cependant: 500 entités avec le même parent peuvent nuire à l'évolutivité, puisque les écritures sont sérialisées aux membres d'un groupe d'entités. Si vous voulez juste suivre l'usine qui fabriquait un produit, utilisez un ReferenceProperty:

class Product(db.Model): 
    factory = db.ReferenceProperty(Factory, collection_name="products") 

Vous pouvez obtenir tous les produits en utilisant:

myFactory.products 
+0

Les docs appellent un filtre, mais il ISN 't? Mercy sakes, que faire ensuite. Le cas d'utilisation pour les écritures est chaque usine crée zéro à dix produits/jour avec un temps minimum entre les produits de dix secondes ("bursty"). 95% des lectures de produit seront fabriquées en usine. Parent-enfant ou ReferenceProperty est-il meilleur? –

+0

Je pense que la recommandation est d'utiliser uniquement les groupes d'entités des transactions, donc ReferenceProperty serait meilleur, bien qu'il n'y ait probablement pas une énorme différence ... – mcobrien

+0

Il n'y a rien de mal avec 500 éléments dans le même groupe d'entités - c'est le taux de mise à jour ça compte. –