如何在Python App Engine中重复创建ndb.ComputedProperty?

时间:2014-07-08 01:22:26

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

我有一个ndb模型:

class MyModel(ndb.Model):

  foo = ndb.KeyProperty(repeated=True)
  bar = ndb.KeyProperty(repeated=True)
  # This doesn't work
  baz = ndb.ComputedProperty(lambda self: self.foo + self.bar, repeated=True)

我想查询既不在foo中也不在bar中的键:

query = MyModel.query().filter(MyModel.foo != my_key).filter(MyModel.bar != my_key)

但是,这不起作用,因为你可以only have one inequality filter

因此,我添加了计算属性baz,以便我可以查询MyModel.baz != my_key。但是,这也不起作用。如果我中断了重复的= True部分,那么每当我放置模型时它都会引发异常,因为非重复属性不能成为列表。

当baz是重复属性时,它会以ComputedPropertyError: Cannot assign to a ComputedProperty失败。即使我将lambda简化为类似lambda self: [1, 2]的内容,即使我在获取值后立即执行put(也没有更改任何内容),它总是会出现此错误。

我可以使用带有预置挂钩的常规属性:

baz2 = ndb.KeyProperty(repeated=True)

def _pre_put_hook(self):
  self.baz2 = self.foo + self.bar

但似乎我应该能够使用ComputedProperty。

为什么我没有重复的ComputedProperty?有没有更好的方法来做我想做的事情?

谢谢!

1 个答案:

答案 0 :(得分:0)

我发现了这个问题。显然,我覆盖了put并使用了put(** my_model._to_dict()),它具有尝试为计算属性赋值的效果。

换句话说,一切都按预期工作,除非你做了一些复杂的事情,否则重复的计算属性工作正常。