如何将NDB数据传递给任务队列?

时间:2014-05-30 15:09:15

标签: python google-app-engine app-engine-ndb task-queue payload

这是我想传递给任务的实体:

class MyData(ndb.Model):
    ...
    text = ndb.StringProperty(indexed=False)
    data = ndb.BlobKeyProperty(repeated=True)
    details = ndb.KeyProperty(kind=Details)

我可以做下面的事吗?

mydata = MyData.query()
mydata = mydata.filter(...)
mydata = mydata.order(MyData.added)
mydata = mydata.fetch(100)
for d in mydata:
  taskqueue.add(url='/worker', payload=d)

如何从有效负载中提取数据呢?不要以为self.request.get('payload')会起作用。 了解我只能传递ndb密钥并读取任务中的实体。但它需要额外的读取操作。或者,我可以在keys_only时以某种方式使用fetch(100)吗?根据{{​​3}}

keys_only次操作是免费的
  

小型数据存储区操作包括分配数据存储区ID的调用   仅密钥查询,这些操作是免费的。

但它们是否被视为数据存储区读取操作?

2 个答案:

答案 0 :(得分:0)

d仍然是一个ndb对象。要将其作为字典传递,请尝试此(未经测试):

taskqueue.add(url='/worker', payload=d.to_dict())

https://developers.google.com/appengine/docs/python/ndb/modelclass#Model_to_dict

答案 1 :(得分:0)

我会使用keys_only查询执行此操作(正如您所提到的,这应该收取很少或不收费),我会更新您的任务队列以添加一次批量调用。

mydata = MyData.query()
mydata = mydata.filter(...)
# the order shouldn't matter, unless you want to make sure that property exists.
# mydata = mydata.order(MyData.added)   
mydata = mydata.fetch(100, keys_only=True)
tasks = [taskqueue.Task(url='/worker', params={'key': key.urlsafe()}) for key in mydata]
taskqueue.Queue('default').add(tasks)