1

私は2つのモデルを持っています:

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")

とにかくそれを行うことはありますか?助けてくれてありがとう..

4

1 に答える 1

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"]

ここでタスクレットについて読むことをお勧めします。

于 2013-07-05T10:28:46.250 に答える