1

J'ai une classe de profil:Mise à jour du modèle de Gae serveur datastore

class profile(db.Model): 
    user = db.stringProperty() 
    # Other properties ... 
    access = db.ListProperty(db.keys) 

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

La classe de profil était là depuis un certain temps calme, mais nous avons ajouté récemment l'accès champ qui permet de stocker les clés d'applications. Maintenant, nous ajoutons des autorisations de profil sur l'application, le champ d'accès n'est pas mis à jour dans le modèle.

Cela fonctionne très bien tout à fait sur localhost, mais quand je mets à jour ce sur le serveur j'obtenir cette erreur « objet « NoneType » n'a pas « accès » attribut » Quelqu'un at-il rencontré même situation

Mise à jour: Déterminé que l'un des objets de la classe profile est retourné comme None. Voici le code qui obtient l'objet de profil sur localhost mais aucun sur le serveur

liuser = users.User(request.POST['user']) 
#request.POST['user'] gets user Gmail ID, which is being converted to user object 
profiles=Profile.all().filter(" user =", liuser).get() 
userprofile=profiles 

#tried below code which returns "'NoneType' object has no attribute 'access'" on server, the same gets a profile object on localhost 
if not hasattr(userprofile, "access"): 
    userprofile.access=[] 

espèrent la mise en forme @ Robert est bien maintenant.

Merci Vous Sai Krishna

+0

Il est plus facile de lire et de répondre à votre question si votre code est formaté. –

+1

Pourriez-vous inclure le code que vous utilisez pour lire et mettre à jour les entités de profil. Vous pouvez également inclure le code réel que vous utilisez. Votre code a plusieurs problèmes, tels que "db.keys" et "db.stringProperty". –

Répondre

1

Nous avons été en mesure de résoudre ce problème. Le problème était avec l'objet users.User qui n'ajoute pas @ gmail.com pour les utilisateurs de gmail, mais alors qu'il accepte d'autres domaines avec le nom de domaine, qui jetais objet Type Aucun

Merci encore une fois pour l'aide

0

Lorsque vous ajoutez une propriété à un modèle, les instances existantes du modèle qui sont datastore ne reçoivent pas automatiquement cette propriété.

Vous devrez modifier votre code de gestionnaire qui interagit avec les entités de profil pour vérifier l'existence de l'accès. La fonction hasattr de Python fera l'affaire. Quelque chose comme ceci:

a_profile = profile.all().somequerystuffheretogetaninstance().get() 
if a_profile is not None: 
    if not hasattr(a_profile, "access"): 
     a_profile.access = whateveryourdefaultdatais 
    # perform my data logic normally after this, but remember to persist 
    # this to the datastore to save the new access property. 
+0

Cela résoudrait mon problème, je suppose, mais ce que j'ai fait, j'ai créé une nouvelle application avec le nouveau schéma de modèle et changé le nom dans le fichier app.yaml, même alors il n'a pas créé le nouveau champ. Cependant, j'ai vu un petit bug dans le code. Lors de la première utilisation de profile.Access a été utilisé à la place de profile.access. Serait-ce la raison pour laquelle le champ 'accès' n'est pas à l'autre endroit. –