在没有中断代码的情况下将StringProperty转换为IntegerProperty并在不更改所有实体的情况下动态执行此操作的最佳方法是什么?
显然假设数据是正确的。
例如: StringProperty = u'1234'变换为IntegerProperty = 1234
现在,如果在获取数据时将模型中的属性从str修改为int,则此属性为None
感谢
答案 0 :(得分:2)
您可以使用GenericProperty加上一个post-get钩子,将字符串更改为整数并将其写回。您可以使回写异步。
答案 1 :(得分:1)
如果您正在使用NDB,您可能还想尝试ComputedProperty:
那么你可以定义自己的属性类型,例如
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()