【问题标题】:Proper way to migrate NDB model property迁移 NDB 模型属性的正确方法
【发布时间】:2015-04-08 23:34:52
【问题描述】:

我目前在 NDB 中有一个模型,我想更改属性名称而不必触及 NBD。假设我有以下内容:

from google.appengine.ext import ndb

class User(ndb.Model):
  company = ndb.KeyProperty(repeated=True)

我想要的是更像这样的东西:

class User(ndb.Model):
  company_   = ndb.KeyProperty(repeated=True)

@property
def company(self):
   return '42'

@company.setter
def company(self, new_company):
    #set company here

有没有一种相对无痛的方法来做到这一点?我想要使​​用属性 getter/setter 的便利性,但考虑到当前的实现,我想避免接触底层数据存储。

【问题讨论】:

  • 我不确定我是否理解您为什么要更改 NDB 中的属性名称,但仍然在代码中使用旧名称。您打算将旧名称用于其他名称吗?或者它只是一个坏名字?也许理解这一点可以帮助我们帮助你:)
  • 据我了解,模型保存在ndb中,字段为“company”。在我的应用程序中,我偶尔会在模型中获取和设置公司,但我想在设置之前添加一些检查,我认为使用属性设置器来做一些检查会很方便。但是,这将需要代码的其他位以不同的名称访问它,或者我可以更改模型中的字段名称并让其他人以相同的方式访问它。我正在查看是否可以保留字段名并将其保留在模型中。
  • 如果你正在做“检查”,你可能想要使用验证器,它允许你在设置它们之前验证和/或强制值...在此处搜索验证器:cloud.google.com/appengine/docs/python/ndb/properties

标签: python google-app-engine google-cloud-datastore app-engine-ndb


【解决方案1】:

您可以通过在 Property() 构造函数中指定 name="xx" 参数来更改类级属性名称,同时保留底层 NDB 属性名称

所以可以这样做:

class User(ndb.Model):
  company_   = ndb.KeyProperty(name="company", repeated=True)

  @property
  def company(self):
    return self.company_

  @company.setter
  def company(self, new_company):
    self.company_ = new_company

所以现在任何时候您访问 .company_ NDB 都会在内部实际设置/获取 "company"...而且您无需进行任何数据迁移

【讨论】:

    【解决方案2】:

    根据我对ndb 的理解,每个实体的属性名称及其内容都存储在数据库中。您将不得不用新的属性名称(并且没有旧的)重写每个实体。

    由于这不是没有痛苦的,也许您可​​以为您的 getter 和 setter 选择其他名称,例如 get_companyset_company

    【讨论】:

      猜你喜欢
      • 2019-03-26
      • 2013-11-19
      • 2018-03-02
      • 1970-01-01
      • 2017-05-11
      • 1970-01-01
      • 2018-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多