更改属性格式

时间:2012-02-15 10:19:39

标签: google-app-engine

在没有中断代码的情况下将StringProperty转换为IntegerProperty并在不更改所有实体的情况下动态执行此操作的最佳方法是什么?

显然假设数据是正确的。

例如: StringProperty = u'1234'变换为IntegerProperty = 1234

现在,如果在获取数据时将模型中的属性从str修改为int,则此属性为None

感谢

2 个答案:

答案 0 :(得分:2)

您可以使用GenericProperty加上一个post-get钩子,将字符串更改为整数并将其写回。您可以使回写异步。

答案 1 :(得分:1)

如果您正在使用NDB,您可能还想尝试ComputedProperty:

https://docs.google.com/document/d/1dsx1hihmMXMJm8wIRu49tJR-KEng80o3wkg4Nlbqn-w/edit#heading=h.crpcpjr4rp21

那么你可以定义自己的属性类型,例如

class Str2IntProperty(Property):
  """A Property whose original string value will be converted to an integer."""

  def _validate(self, value):
    if not isinstance(value, (int, long, str)):
      raise datastore_errors.BadValueError('Expected integer, got %r' %
                                           (value,))
    return int(value)

  def _db_set_value(self, v, unused_p, value):
    if not isinstance(value, (str, int, long)):
      raise TypeError('Str2IntProperty %s can only be set to integer or string values; '
                      'received %r' % (self._name, value))
    v.set_int64value(int(value))

  def _db_get_value(self, v, unused_p):
    if not v.has_int64value():
      try:
        return int(v)
      except ValueError:
        return 0
    return int(v.int64value())

然后在你的模型中

class MyModel(ndb.Model):
  my_prop = Str2IntProperty()