Python Google应用程序引擎数据存储:过滤器()

Python Google应用程序引擎数据存储:过滤器(),python,google-app-engine,google-cloud-datastore,Python,Google App Engine,Google Cloud Datastore,我正在尝试使用filter()方法从Google App Engine的数据存储中检索条目,如下所示: result = Sender.all().filter("email =", email).filter("source_address =", source).filter("dest_address =", dest).filter("food_type =", food_type) 然后,如果存在这样一个条目,我将更改该条目中一列的值。否则,我将显示一条错误消息 if

我正在尝试使用
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()
方法施加的条件,数据存储中不存在条目,也不会显示
无此类请求。
消息。相反,我得到的只是一张空白页


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

来自App Engine Development server的日志会说什么?您的请求看起来像是旧式数据存储请求,而不是ndb请求,因此您可能语法错误,并且代码在发送任何响应之前引发异常。

:

调用以实现真值测试和内置操作
bool()
;应返回False或True,或其整数等价物0或1。未定义此方法时,如果已定义,则调用
\uuuu len\uuuu()
,如果结果为非零,则认为该对象为真。如果一个类既没有定义
\uuuu len\uuuu()
也没有定义
\uuu nonzero\uuuuu()
,那么它的所有实例都被认为是真的

gae
查询
似乎既没有实现
\uuuuuu非零
也没有实现
\uuuuuuu len\uuuuuu
,因此更好的检查方法是:

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

根据前面的答案,查询对象将始终解析为true

在对查询的结果集进行计数、迭代、获取或获取之前,不会执行查询

我会做一些更像

   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.") 

这是非常低效的-调用.count()的成本与执行查询的成本基本相同。事实上,效率非常低,因为查询将被预先执行两次。除非结果集足够大,能够产生明显的影响,否则效率不是“非常”或“完全”低。虽然我们不知道结果集有多大,但我已经更新了代码以提高效率。但为什么要这么做呢。如果没有人做些什么,那就用结果来工作吧。e@TimHoffman
count()
方法比
get()
fetch()
更快,因为它不检索文档中的所有字段,只检索一个计数。随着结果集的增加,速度仍然会变慢,但这根本不是OP的问题。我认为增加
limit=1
在效率方面应该已经足够了