我正在使用map_async
(通过remote_api)使用一个非常简单的回调tasklet,它只删除传递的密钥。但是,所有实体都是不始终在第一次删除。在大多数情况下,我必须多次运行查询以删除所有实体。代码:
@ndb.tasklet
def delete_key_tasklet(key):
yield key.delete_async()
class Person(ndb.Model):
name1 = ndb.StringProperty()
name2 = ndb.StringProperty()
@classmethod
def delete_persons_async(cls, ancestor_key, name):
q = cls.query(ancestor=ancestor_key)
q = q.filter(ndb.OR(cls.name1 == name, cls.name2 == name))
return q.map_async(delete_key_tasklet, keys_only=True)
例如,如果我使用以下查询:
Person.delete_persons_async(ancestor_key, 'David').get_result()
我希望删除名称为“David”的所有Person
个实体。
yield key.get_async()
,它会正确获取所有实体。所以:
答案 0 :(得分:1)
您需要在@ndb.toplevel
中包装整个操作,或者在delete_async
返回值的结果上显式调用ndb.Future.get_result
,以确保操作完成。
如果请求处理程序退出太早,则put可能永远不会发生