我有一个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?有没有更好的方法来做我想做的事情?
谢谢!
答案 0 :(得分:0)
我发现了这个问题。显然,我覆盖了put并使用了put(** my_model._to_dict()),它具有尝试为计算属性赋值的效果。
换句话说,一切都按预期工作,除非你做了一些复杂的事情,否则重复的计算属性工作正常。