NDB查询基于Model的KeyProperty实例值

时间:2013-06-19 07:27:15

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

我有两种模式:

class Project:
    name = ndb.StringProperty(required=True)
    status = ndb.StringProperty()
    == Other fields ==

class Task:
    name = ndb.StringProperty(required=True)
    project = ndb.KeyProperty(kind=Project, required=True)

我需要查询对象,其中包含项目状态为"正在进行中的所有任务"。我在做:

tasks = [task for task in Task.query() if task.project.get().status == "In-Progress"

这将返回任务列表,但我想要的是查询对象,可用于调用fetch_page进行分页。

我无法使用:tasks = Task.query(Task.project.get().status == "In-Progress")

反正有吗?谢谢你的帮助..

1 个答案:

答案 0 :(得分:2)

正如其他人在评论中所说,你遇到的问题是你的项目状态不是任务的一部分。但是,为了使这种查询更有效,您需要进行非规范化(这将涉及将项目状态添加到任务模型中)。

如果你不想反规范化,那么你应该异步进行项目获取。这将使您的请求更有效率(更低的成本和更快的返回值)。

以下内容(尚未测试):

@ndb.tasklet
def callback(task):
  project= yield tast.project.get_async()
  task.fetched_project = project
  raise ndb.Return(task)

#fetch the tasks, you could do paging here.
tasks = Task.query().fetch_page(20)

#map projects onto tasks
results = yield map(callback, tasks)

#filter tasks based on project (fetched_project now exists on task) status:
tasks = [task for task in results if task.fetched_project.status == "In-Progress"]

我建议您阅读有关tasklets here的内容。