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

时间:2015-06-22 18:55:50

标签: 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 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

3 个答案:

答案 0 :(得分:2)

根据之前的答案,查询对象将始终解析为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.") 

答案 1 :(得分:1)

object.__nonzero__

  

被要求实施真值测试和内置操作bool();应该返回False或True,或者它们的整数等价于0或1.如果未定义此方法,则调用__len__()(如果已定义),并且如果对象的结果非零,则认为该对象为true。如果某个类既未定义__len__()也未定义__nonzero__(),则其所有实例都被视为true。

似乎gae Query没有实现__nonzero____len__,因此更好的检查方法是:

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

答案 2 :(得分:-1)

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