为什么在Query中使用索引元素时put()不起作用?

时间:2011-10-05 13:53:07

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

如果我直接将模型类作为put()的索引成员访问,我遇到Query似乎不起作用的问题;但是,当我从Query显式提取类时,它似乎工作正常。这是为什么?

此代码有效:

class Record:
   field = db.StringProperty()

rs = Record.all().filter('name = ', name_str)
if rs.count() == 1:
   # assume that we only get one record in return...
   r = rs[0]
   r.field = some_value
   r.put()

并且此代码不会(并且不会引发任何错误)

class Record:
   field = db.StringProperty()

rs = Record.all().filter('name = ', name_str)
if rs.count() == 1:
   # assume that we only get one record in return...
   rs[0].field = some_value
   rs[0].put()

1 个答案:

答案 0 :(得分:4)

每次索引这样的查询时,它都会重新执行查询,获取相关结果,对其进行解码并将其返回给您。在第二个片段中,您修改实体的一个实例,立即丢弃它,然后获取并存储(未修改)第二个副本。

通常,您应该避免为此类查询编制索引 - 请改为调用.get().fetch()

出于同样的原因,您应该尽可能避免使用.count(),因为它还需要运行另一个查询。如果您只想要一个结果,请致电.get();如果您需要更多,请致电.fetch(),然后计算返回的结果数。