Google App Engine 数据存储区:filter()

Google App Engine datastore: filter()

我正在尝试使用 filter() 方法从 Google App Engine 的数据存储中检索条目,如下所示:

result = Sender.all().filter("email =", email).filter("source_address =", source).filter("dest_address =", dest).filter("food_type =", food_type)

然后,如果存在这样的条目,我将更改该条目中其中一列的值。否则,我会显示一条错误消息。

        if result:
            for e in result:
                e.time_of_delivery = toj
                e.put()
                self.response.write("Time of delivery successfully rescheduled !")
        else:
            self.response.write("No such request.") 

但是,即使根据我使用的 filter() 方法强加的条件,数据存储中的条目不存在,也永远不会显示 No such request. 消息。相反,我得到的只是一个空白页。

我的代码究竟有什么问题?为什么当在数据存储区中找不到条目时,我的代码的 else 部分从未执行,即当 result = None 时?

App Engine 开发服务器的日志说明了什么?您的请求看起来像旧式数据存储请求,而不是 ndb 请求,因此您的语法可能有误,并且代码在发送任何响应之前抛出异常。

object.__nonzero__:

Called to implement truth value testing and the built-in operation bool(); should return False or True, or their integer equivalents 0 or 1. When this method is not defined, __len__() is called, if it is defined, and the object is considered true if its result is nonzero. If a class defines neither __len__() nor __nonzero__(), all its instances are considered true.

似乎 gae Query 没有实现 __nonzero____len__ 所以更好的检查方法是:

if result.count(limit=1):  # retrieves only 1 record
    # results exist
else:
    # results don't exist

查询对象将始终按照之前的答案解析为真。

在您计算、迭代、获取或获取其结果集之前,不会执行查询。

我会做一些更像

   has_result = False
   for e in results:
       e.time_of_delivery = toj
       e.put()
       self.response.write("Time of delivery successfully rescheduled !")
       has_result = True
   if not has_result:
       self.response.write("No such request.")