【问题标题】:GAE NDB: Adding and automatically occupying new fieldsGAE NDB:添加和自动占用新字段
【发布时间】:2014-04-22 18:49:30
【问题描述】:

假设我有这个模型:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    计算属性 (ComputedProperty) 是只读属性,其 值是由其他属性值计算的 应用程序提供的功能。计算值写入 数据存储,以便可以在数据存储中查询和显示 查看器,但在回读实体时忽略存储的值 从数据存储;而是通过调用 每当请求值时起作用。例如:

    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

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

    【讨论】:

      【解决方案2】:

      你可以只写一个脚本,运行一次,这样做:

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

      【讨论】:

      • 感谢@IanGSY 的回答。这似乎是最明显的解决方案。我认为可能有一个 GAE 约定来更改如此大量的数据,因为如果这种方法失败,那么我们可能会冒大量数据的风险。在此之前有什么预防措施吗?或许 ether 是导出数据存储实体的一种选择?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多