GAE NDB:添加并自动占用新字段

时间:2014-04-22 18:49:30

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

所以,让我说我有这个模型:

class User(ndb.Model):
    username = ndb.StringProperty(required = True)

一周后,会创建几百个用户实体。现在我想添加另一个字段:

class User(ndb.Model):
    username = ndb.StringProperty(required = True)
    username_lower = ndb.StringProperty() # username.lower()

我不会要求每个用户输入他们现有用户名的小写版本,那么我如何自己占用每个用户实体的这些字段?

2 个答案:

答案 0 :(得分:3)

小写用户名实际上是用于计算属性的示例。

  

计算属性( ComputedProperty )是只读属性   值由其他属性值计算得出   应用程序提供的功能。计算出的值写入   数据存储,以便可以在数据存储区中查询和显示它   viewer,但在回读实体时会忽略存储的值   来自数据库;相反,通过调用the来重新计算该值   在请求值时运行。例如:

class SomeEntity(ndb.Model):
  name = ndb.StringProperty()
  name_lower = ndb.ComputedProperty(lambda self: self.name.lower())

x = SomeEntity(name='Nick')

x.name = 'Nick'
assert x.name_lower == 'nick'
x.name = 'Nickie'
assert x.name_lower == 'nickie'

https://developers.google.com/appengine/docs/python/ndb/properties#computed

由于早期模型没有存储值,因此不存在它并不重要,因为它不会直接使用。

答案 1 :(得分:1)

你可以制作一个脚本,运行一次,这样做:

for user in User.query():
    user.username_lower = username.lower()
    user.put()