繁体   English   中英

Google Cloud Datastore“ NoneType”对象没有属性“ email”

[英]Google Cloud Datastore 'NoneType' object has no attribute 'email'

当我尝试从数据存储中获取一种类型时,它返回NoneType,好像查询为空。 我知道数据存储在保存时可以正常工作,但是不能从查询中提取一种。

同样使用Google Cloud Console网站中的GQL查询并使用SELECT * FROM User会返回所有种类。 用户种类没有父母,这是根本。 我确保所有属性也都已编入索引。

我不确定我在GET上做错了什么。

MyApp.py

import webapp2
from google.appengine.ext import ndb
from google.appengine.ext.db import GqlQuery


class MainHandler(webapp2.RequestHandler):

    def post(self):
        message = self.request.body
        message = message.splitlines()

        if message[0] == "register":
            user = User.create_user(message[1], message[2], message[3])
            user_key = User.save_user(user)
            if user_key is not None:
                self.response.write(user_key)

        else:
            user = User.get_by_id(User.email == message[0])
            if User.token == message[1]:
                self.response.write("CURRENT")
            else:
                User.token = message[1]
                User.save_user(user)
                self.response.write("UPDATED")

    def get(self):
        self.response.write("CONNECTED")
        user= User.query().get()
        self.response.write("\n" + query.email)


class User(ndb.Model):
    email = ndb.StringProperty()
    token = ndb.StringProperty()
    name = ndb.StringProperty()

    @classmethod
    def create_user(cls, email, token, name):
        user = User(email=email, token=token, name=name, id=email)
        return user

    @classmethod
    def save_user(cls, user):
        user_key = user.put()
        return user_key

    @classmethod
    def get_user(cls, email):
        return User.get_by_id(User.email == email)


app = webapp2.WSGIApplication([
    ('/', MainHandler)
], debug=True)

您似乎将.get_by_id()与查询混淆了。

get_by_id方法实际上是映射到ndb.Model._get_by_id它调用ndb.Model._get_by_id_async ,这需要一个实体键标识,以确定用于直接实体的查找实体的键(未查询!)。 来自appengine.ext.ndb.model.py

  @classmethod @utils.positional(3) def _get_by_id_async(cls, id, parent=None, app=None, namespace=None, **ctx_options): """Returns an instance of Model class by ID (and app, namespace). This is the asynchronous version of Model._get_by_id(). """ key = Key(cls._get_kind(), id, parent=parent, app=app, namespace=namespace) return key.get_async(**ctx_options) 

但是在您的代码中,您将id作为一个bool传递: User.email == message[0] ,它很可能与任何现有的实体密钥标识符都不匹配,因此None结果导致您看到错误。

由于可用信息是您可能要执行查询的实体属性的值( email值),因此类似以下几行:

results = User.query(User.email == message[0]).fetch(limit=1)
if results:
   user = results[0]

因此,我找出了问题所在。 因此,在我的计算机上设置Google Cloud SDK的方式似乎存在问题。 当在google服务器上而不是在我的网络上运行相同的代码时,一切似乎都能正常运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM