2012-04-09 3 views
1

J'essaie d'obtenir que tous les parents/enfants aient une relation de un à plusieurs. Traditionnellement, je pouvais le faire avec une jointure, mais le faire dans le magasin de données m'échappe.GAE DataStore referenceProperty relationship

J'ai trouvé plusieurs exemples partiels pour ce faire, mais pas encore complet.

J'ai:

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

class Pet(db.Model): 
    petname = db.StringProperty() 
    owner = db.ReferenceProperty(Owner, collection_name='pets') 

#now I want to print all pets owned by scott 
scott = Owner(name="scott") 
scott.put() 
Pet(owner=scott,petname="rufus").put() 

pets = Pet.all().filter('owner =', "scott").fetch(100) 
print Pet.all().filter('owner =', "scott").fetch(0) 

Répondre

4

Votre requête devrait fonctionner correctement si vous supprimez les guillemets autour de « scott », je pense.

Vous pouvez également faire toutes les entités pour animaux de compagnie de Scott ont son entité comme leurs parents:

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

class Pet(db.Model): 
    petname = db.StringProperty() 

scott = Owner(name="scott") 
scott.put() 

Pet(parent=scott, petname="rufus").put() 
Pet(parent=scott, petname="fluffy").put() 
Pet(parent=scott, petname="snoogums").put() 

pets = Pet.all().ancestor(scott).fetch(100) 
# Feed pets to your templating engine. So to speak. 

En faisant scott parent des entités animaux, ils sont tous ajoutés au même groupe d'entités, et la ancestor La requête vous donne une manière simple et rapide d'obtenir toutes les entités Pet qui sont des enfants du `Propriétaire 'donné. Vous devriez obtenir de meilleures performances avec une requête ancêtre qu'avec une requête non-ancêtre. Cela impose la limitation que les entités Pet ne peuvent appartenir qu'à un seul groupe d'entités et si vous souhaitez avoir un Pet impliqué dans plusieurs relations de données, vous devez choisir une autre approche. S'il s'agit d'une relation un-à-un, il suffit de stocker une référence dans l'autre entité associée.

Pour avoir une représentation imprimable de votre entité Pet, lui donner une méthode __unicode__, quelque chose comme ceci:

class Pet(db.Model): 
    petname = db.StringProperty() 

    def __unicode__(self): 
     return "I am " + self.petname 

__unicode__ doit retourner une chaîne avec les informations que vous souhaitez voir imprimé par la déclaration print. Comme Nick le signale judicieusement dans les commentaires, vous ne devriez pas utiliser print dans une application AppEngine. Le SDK est livré avec des modèles Django et Jinja2. Utilisez l'un de ceux-ci ou en importez un que vous préférez.

+0

Je pense que pourrait être ce que je cherche, mais comment puis-je les imprimer? Si juste: impression animaux Je reçois: [<__ main__.Pet objet à 0x10859df50>, <__ main__.Pet objet à 0x1085904d0>, <__ main__.Objet familier à 0x107bccb50>] –

+0

a répondu à votre question, @stubblejumper –

+0

Notez que '__repr__' est destiné à renvoyer une représentation 'code' d'un objet; '__unicode__' est la méthode à utiliser pour une représentation lisible par un humain - mais vous devriez probablement utiliser un système de template et ne sortir que les bits qui vous intéressent dans la situation actuelle. Et vous ne devriez vraiment, vraiment, vraiment pas utiliser 'print' dans une application App Engine. –

0

Regardez The GQL examples made by google.

Utilisez le nom du propriétaire comme clé unique donnant 'scott' à nom_clé au lieu de 'nom' lors de l'installation du propriétaire.

scott = Owner(key_name="scott") 

Créer l'animal avec scott comme parent

pet = Pet(key_name='rufus', parent=scott) 

Et QUERY ses animaux avec

SELECT * FROM Pets WHERE ANCESTOR IS KEY('Owner', 'scott') 
0

Vous devez filtrer par clé du propriétaire:

#not str "scott", use scott object. 
pets = Pet.all().filter('owner =', scott).fetch(100)