繁体   English   中英

如何在Python App Engine中重复执行ndb.ComputedProperty?

[英]How can I make a repeated ndb.ComputedProperty in Python App Engine?

我有一个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)

但是,这不起作用,因为您只能有一个不等式过滤器

这样,我添加了计算属性baz,以便可以查询MyModel.baz != my_key 但是,这也不起作用。 如果我忽略其中的repeat = True部分,那么每次放置模型时都会引发异常,因为无法重复列出非重复属性。

如果baz是重复属性,则它将失败,并出现ComputedPropertyError: Cannot assign to a ComputedProperty 即使我将lambda简化为lambda lambda self: [1, 2] ,即使我在获取值后立即执行了一次卖出操作(不进行任何更改),也总是会因此错误而失败。

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

baz2 = ndb.KeyProperty(repeated=True)

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

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

为什么不能重复计算ComputeProperty? 有没有更好的方法来做我想做的事?

谢谢!

我发现了问题。 显然,我覆盖了put并使用了put(** my_model._to_dict()),它的作用是尝试为计算的属性分配某些内容。

换句话说,一切都按预期工作,除非您执行复杂的工作,否则重复计算的属性可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM