使用NDBs ComputedProperty通过祖先查询计算另一个模型的对象

时间:2013-06-03 18:11:18

标签: python google-app-engine app-engine-ndb

我正在利用NDBs ComputedProperty和一个祖先查询来计算与特定过滤器匹配的另一个模型的对象。 ComputedProperty看起来像这样:

class Goal(ndb.Model):
    various_attributes = various_properties
    @ndb.ComputedProperty
    def count_active_actions(self):
        return Action.query(ancestor=self.key).filter(
                Action.status=='active').count()

class Action(ndb.Model):
    status = ndb.StringProperty(choices=(
            'not started', 'active', 'completed', 'on hold'))
    various_attributes = various_properties
    @ndb.ComputedProperty(
    def count_active_tasks(self):
        return Task.query(ancestor=self.key).filter(
                Task.status=='active').count()

class Task(ndb.Model):
    status = ndb.StringProperty(choices=(
            'not started', 'active', 'completed', 'on hold'))
    various_attributes = various_properties

当我创建一个Goal对象时,我不会将任何内容存储为其父对象。 请注意,我在目标上有类似的ComputedProperty,就像我在Action上做的那样。在编写目标时执行goal.put()时,我没有收到任何错误。

但是,在创建操作对象时,我将父项存储为goal.key,如下所示:

action = Action(parent=goal.key, various_other_properties = various_other_values)
action.put()

执行操作时,正在执行ComputedProperty查询,并且如果操作尚未完全写入,则尚未分配id for action,因此None

我收到的错误是:

BadValueError: Expected complete Key, got Key('Goal', '##########', 'Action', None)

鉴于我认为在幕后发生的事情,这种行为是有道理的。但是我假设我错过了某些东西或者我正在接近这个问题,因为在我看来这是一个常见的用例。

我希望的目标是让父对象的属性表示与某个条件相匹配的子对象的计数,并将父对象的键作为其祖先。

有没有更好的方法来实现这一目标?还是有一些我不知道的明显事物?

0 个答案:

没有答案