2010-10-28 18 views
0

Je suis en train de créer une application avec Google App Engine (et Python). J'ai deux questions à propos de la récupération des données du magasin de données.Récupération de données hiérarchiques à partir du magasin de données

J'ai des informations sur les utilisateurs et des informations sur les publications faites par les utilisateurs. Voici une partie de modèles de DB:

class User(db.Model): 
    country = db.StringProperty() 
    # many other entities 

class Post(db.Model): 
    author = db.ReferenceProperty(User) 
    # many other entities 

Je veux récupérer des messages, qui sont faits par des utilisateurs de certain pays. Je l'ai essayé de cette façon:

posts_query = Post.all().filter(' author.country == ', country) 
posts = posts_query.fetch(limit = 100) 

Mais cette requête ne renvoie aucun résultat (la variable de pays a une valeur qui existe dans le magasin de données). Ce que j'ai besoin de corriger dans ma requête, donc ça marche?

Et la deuxième question: comment (dans la situation donnée) je peux récupérer tous les messages de la banque de données, si le compte de poste est inconnu (et peut être> 100)?

Merci à l'avance,

-skazhy

Répondre

3

Si vous voulez faire cela, vous devez dénormaliser: stocker une copie du pays de l'utilisateur sur tous leurs postes, et demande à ce sujet. Le magasin de données ne prend pas en charge les jointures, ce qui serait nécessaire pour satisfaire cette requête, et dans tous les cas, la dénormalisation est beaucoup plus efficace.

En ce qui concerne la récupération de tous les résultats, vous pouvez spécifier une limite arbitrairement grande, mais pensez: voulez-vous vraiment faire cela? Il y a une limite sur le nombre de résultats que vous pouvez raisonnablement présenter à un utilisateur en une seule fois; Si vous avez plus de résultats, vous voudrez certainement paginer.

0

Dénormalisation en cours. Si le pays est une chose spécifique dont vous avez besoin de faire des recherches fréquemment, vous pouvez ajouter un nouveau modèle juste pour cela. Le pays devient alors un ReferenceProperty pour l'utilisateur et la Poste:

class User(db.Model): 
    country = db.ReferenceProperty(Country,collection_name=users) 
    # many other entities 

class Post(db.Model): 
    author = db.ReferenceProperty(User) 
    country = db.ReferenceProperty(Country,collection_name=posts) 
    # many other entities 

class Country(db.Model): 
    name = db.StringProperty() 

# posts from everyone in the user's country: 
# user.country.posts.all() 

En réponse à votre deuxième question, vous pouvez utiliser votre posts_query comme itérables pour récupérer tous les résultats. Voir les documents App Engine: http://code.google.com/appengine/docs/python/datastore/queryclass.html#Query_fetch