【问题标题】:Google Cloud Datastore 'NoneType' object has no attribute 'email'Google Cloud Datastore 'NoneType' 对象没有属性 'email'
【发布时间】:2018-11-18 00:30:51
【问题描述】:

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

还使用 Google 云控制台网站中的 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)

【问题讨论】:

    标签: python python-2.7 google-app-engine google-cloud-datastore webapp2


    【解决方案1】:

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

    get_by_id 方法实际上映射到调用ndb.Model._get_by_id_asyncndb.Model._get_by_id,这需要一个实体键标识符来确定用于直接实体查找的实体键(不是查询!)。来自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 传递一个布尔值:User.email == message[0],这很可能与任何现有的实体键标识符都不匹配,因此 None 结果会导致您看到的错误。

    由于您可用的信息是实体属性的值(email 值),您可能希望执行查询,类似以下内容:

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

    【讨论】:

    • 感谢您的帮助。可悲的是,这没有奏效。所以我知道.get_by_id() 是错误的。我尝试使用电子邮件作为 id,但后来意识到它只支持 int 值......(我在发布问题之前忘记删除它)。但是即使我尝试通过results = User.query(User.email == message[0]).fetch(limit=1)获取查询结果列表总是空的(results[0],索引超出范围。)我在gcloud数据存储控制台中手动创建了一些实体进行测试。同样user = User.get_by_id(5749328048029696) self.response.write("\n" + user.email) 返回 NoneType 异常
    • 您在message[0] 中看到有效的电子邮件字符串吗?如果通过 GQL 查询相同的消息字符串,您会看到结果吗?
    • 所以我知道出了什么问题。因此,在我的计算机上设置 Google Cloud SDK 的方式似乎存在问题。在谷歌服务器上而不是在我的网络上运行相同的代码时,一切似乎都正常工作。感谢您的所有帮助。
    【解决方案2】:

    所以我知道出了什么问题。因此,在我的计算机上设置 Google Cloud SDK 的方式似乎存在问题。在谷歌服务器上而不是在我的网络上运行相同的代码时,一切似乎都正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-15
      • 2021-06-12
      • 2016-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      相关资源
      最近更新 更多