2012-06-01 4 views
0

Ceci est mon modèle pour les utilisateurs stockage:Comment mettre à jour datastore GAE

class User(db.Model): 
    username = db.StringProperty(required = True) 
    password = db.TextProperty(required = True) 
    email = db.TextProperty(required = True) 

Supposons cet utilisateur signup, et je mis là des données dans datastore

u = Post(username = joey, password = encrypt(password), [email protected]) 
u.put() 
u = Post(username = chandler, password = encrypt(password), [email protected]) 
u.put() 
u = Post(username = ross, password = encrypt(password), [email protected]) 
u.put() 

Si l'utilisateur clique Mot de passe ou changer le mot de passe. Comment puis-je récupérer l'enregistrement avec un nom d'utilisateur ou un e-mail comme clé et mettre à jour un nouveau mot de passe chiffré?

J'ai essayé les éléments suivants:

u = User.all().filter('username=', 'joey').fetch(10) 
     for r in u: #assuming I get only one record. 
     r.password = encrypt(password) 
     r.put() 

sous une nouvelle autre enregistrement dans le magasin de données. Maintenant, j'ai deux enregistrements de joey.

Également essayé, en utilisant GqlQuery récupérer l'enregistrement de l'utilisateur et essayer de mettre à jour l'enregistrement. Il lance erreur que "Liste n'a pas mis() méthode définie"

S'il vous plaît ne pas me lier à la documentation, il me donne mal à la tête. TL; DR: comment mettre à jour la banque de données dans GAE en utilisant des données définies par l'utilisateur comme clé.

EDIT: code de correction typo.

+0

Remplacez 'wu' par' u'. Excepté le fait que vous créez 3 entités 'Post' (et aucune entité' User'), et n'enregistrez que l'une d'entre elles dans l'installation, c'est exactement ce que vous faites. Bien que '.get()' soit meilleur qu'utiliser '.fetch (10)' et itérer à travers ce que vous espérez est une liste d'un résultat. Eh bien, et le fait que votre code ne fonctionnera pas du tout parce que vous passez des chaînes non-cotées. – geoffspear

+0

Le code est un peu faux parce que j'ai manqué quelques étapes tout en convertissant mon exemple à plus générique. Le principal problème pour moi est que j'ai besoin de code pour UPDATE. – hashg

+0

Si vous récupérez une entité et que vous appelez sa méthode '.put()', vous la mettrez à jour, à moins que vous n'agitiez avec la clé. – geoffspear

Répondre

0

La raison pour laquelle vous avez une erreur "La méthode n'a pas la méthode put() définie" est parce que GqlQuery renvoie une liste. Vous devez également vous assurer que le nom d'utilisateur est unique. Essayez ci-dessous:

users = db.GqlQuery("select * from User where username=:1", username).fetch(1) 
    if len(users) == 0: 
     err = "not user with name " + username 
    else: 
     user = users[0] 
     # change password for user 
     ...