Google数据存储NDB验证可选IntegerProperty



如何验证空表单字段字符串''以将None分配给IntegerProperty?

class MyIntegerProperty(ndb.IntegerProperty):
def _validate(self, value):
if isinstance(value, basestring):
if len(value) == 0 and self._required is False:
return ?????????????????
try:
value = int(value)
except ValueError:
raise BadValueError(u'{0} must be a valid ' 
'integer'.format(self._name))
if value < 0:
raise BadValueError(u'{0} must be ' 
'positive'.format(self._name))
return value
class Account(ndb.Model):
posint = MyIntegerProperty()

文件显示:

_validate((、_to_base_type((和_from_base_type(需要处理:

None:它们不会用None调用(如果它们返回None意味着该值不需要转换(。

我目前正在做的是手动处理该案例:

if len(request.form[name]) == 0:
delattr(entity, name)
else:
setattr(entity, name, request.form[name])

它能比这个更聪明吗?

验证器可以生成属性值,也可以引发异常,从而阻止实体的保存。从属性选项表:

将使用参数(prop,value(调用,并且应返回(可能是强制的(值或引发异常。调用函数不应进一步修改强制值。(例如,返回value.strip((value.lower((是很好,但不是值+'$'。(也可能返回,这意味着"没有变化"。另请参阅写入属性子类

但以上都不是您真正想要的,即删除属性。注意:

  • 设置None的属性值(例如,对于IntegerProperty,这将失败(与删除属性(对于IntegerProperty,完全可以(不是一回事
  • 在使用验证器时设置None的属性值可能很棘手,因为从验证器返回None意味着no change

所以我相信你必须保持目前对此案的处理。

最新更新