我在ComputedProperty中有一个StructuredProperty在第一次创建对象时不会更新。
当我创建对象时,address_components_ascii不会被保存。该字段在数据存储查看器中根本不可见。但如果我get()然后立即再次put()(即使没有改变任何东西),则ComputedProperty会按预期工作。address_components字段工作正常。
我试图清除数据库,并删除整个数据库文件夹,但没有成功。
我在Windows7上使用本地开发服务器。我没有在GAE上测试过。
代码如下:

class Item(ndb.Model):
    location = ndb.StructuredProperty(Location)

内部位置类:
class Location(ndb.Model):
    address_components = ndb.StringProperty(repeated=True)  # array of names of parent areas, from smallest to largest
    address_components_ascii = ndb.ComputedProperty(lambda self: [normalize(part) for part in self.address_components], repeated=True)

规范化函数
def normalize(s):
    return unicodedata.normalize('NFKD', s.decode("utf-8").lower()).encode('ASCII', 'ignore')

address_components字段的示例:
[u'114B', u'Drottninggatan', u'Norrmalm', u'Stockholm', u'Stockholm', u'Stockholms l\xe4n', u'Sverige']

以及address_components_ascii字段,在第二个put()之后:
[u'114b', u'drottninggatan', u'norrmalm', u'stockholm', u'stockholm', u'stockholms lan', u'sverige']

最佳答案

我刚刚在dev服务器上尝试了这段代码,它已经成功了。可在放置前后访问计算属性。

from google.appengine.ext import ndb

class TestLocation(ndb.Model):
  address = ndb.StringProperty(repeated=True)
  address_ascii = ndb.ComputedProperty(lambda self: [
    part.lower() for part in self.address], repeated=True)

class TestItem(ndb.Model):
  location = ndb.StructuredProperty(TestLocation)

item = TestItem(id='test', location=TestLocation(
  address=['Drottninggatan', 'Norrmalm']))
assert item.location.address_ascii == ['drottninggatan', 'norrmalm']
item.put()
assert TestItem.get_by_id('test').location.address_ascii == [
  'drottninggatan', 'norrmalm']

关于python - ComputedProperty仅在第二个put()上更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30266237/

10-11 03:34