2

J'essaie de comprendre les relations 1-à-plusieurs dans le magasin de données; mais je ne parviens pas à comprendre comment interroger et mettre à jour l'enregistrement d'un utilisateur lorsque le modèle comprend ReferenceProperty. Dire que j'ai ce modèle:Comment interroger le magasin de données lors de l'utilisation de ReferenceProperty?

class User(db.Model): 
    userEmail = db.StringProperty() 
    userScore = db.IntegerProperty(default=0) 

class Comment(db.Model): 
    user = db.ReferenceProperty(User, collection_name="comments") 
    comment = db.StringProperty() 

class Venue(db.Model): 
    user = db.ReferenceProperty(User, collection_name="venues") 
    venue = db.StringProperty() 

Si je comprends bien, le même utilisateur, identifié de manière unique par userEmail peut avoir de nombreux commentaires et peut être associé à de nombreux lieux (restaurants, etc.)

Maintenant, disons l'utilisateur [email protected] est déjà dans la base de données et il soumet une nouvelle entrée.

Based on this answer je fais quelque chose comme:

q = User.all() 
q.filter("userEmail =", [email protected]) 
results = q.fetch(1) 
newEntry = results[0] 

Mais je ne suis pas certain que cela fait! Ce que je veux faire est de mettre à jour les champs comment et venue qui sont sous class Comment et class Venue.

Pouvez-vous m'aider à comprendre comment cela fonctionne? Merci.

Répondre

4

L'extrait que vous avez envoyé ce fait (voir les commentaires):

q = User.all() # prepare User table for querying 
q.filter("userEmail =", "[email protected]") # apply filter, email lookup 
               - this is a simple where clause 
results = q.fetch(1) # execute the query, apply limit 1 
the_user = results[0] # the results is a list of objects, grab the first one 

Une fois ce code the_user sera un objet qui correspond à l'enregistrement de l'utilisateur avec le courrier électronique "[email protected]". Si vous avez configuré vos propriétés de référence, vous pouvez accéder à ses commentaires et à ses sites avec the_user.comments et the_user.venues. Certains lieu de ceux-ci peut être modifié, par exemple comme ceci:

some_venue = the_user.venues[0] # the first from the list 
some_venue.venue = 'At DC. square' 
db.put(some_venue) # the entry will be updated 

Je vous suggère de faire un balayage général de la documentation Gae qui a de très bons exemples, vous trouverez très utile: http://code.google.com/appengine/docs/python/overview.html

** Mise à jour **: pour ajouter un nouveau site à l'utilisateur, il suffit de créer un nouveau lieu et attribuer l'objet utilisateur interrogé comme l'attribut utilisateur du lieu:

new_venue = Venue(venue='Jeferson memorial', user=the_user) # careful with the quoting 
db.put(new_venue) 
+0

Bonne explication, très utile, merci. Mais je ne comprends toujours pas comment j'ajoute un nouveau lieu associé à l'utilisateur. Dans l'exemple que vous donnez, j'attrape un lieu qui se trouve déjà dans la base de données et le modifie. Mais cet utilisateur est en train de poster un nouveau commentaire sur un nouveau lieu. – Zeynel

+0

Voir la mise à jour ci-dessus. – vonPetrushev

+0

Un grand merci pour votre aide avec cette question (en particulier, vos commentaires ligne par ligne). – Zeynel

1

Pour obtenir tous les commentaires pour un utilisateur donné, filtrer la propriété de l'utilisateur en utilisant la clé de l'utilisateur:

comments = Comment.all().filter("user =", user.key()).fetch(50) 

Ainsi, vous pouvez d'abord rechercher l'utilisateur par l'e-mail, puis rechercher des commentaires ou des lieux en utilisant son clé.

+1

en fait, il n'a pas à le faire - une fois qu'il charge l'utilisateur avec la recherche d'email, les commentaires sont facilement accessibles avec 'user.comments'. – vonPetrushev

+0

Merci pour votre réponse. Je ne sais pas comment trouver la clé pour rechercher des commentaires ou des lieux. Je dois lire ce que cela signifie. Mais dans ce cas, ce que je veux faire, c'est comprendre, comment ajouter un commentaire et un lieu à un utilisateur. Comment mettre à jour l'enregistrement d'un utilisateur avec un nouveau commentaire? – Zeynel

+0

@vonPetrushev: Merci encore pour votre réponse. Comment puis-je "charger l'utilisateur avec une recherche par e-mail?" Je ne suis pas sûr de ce que cela signifie. – Zeynel