Google app engine Google数据存储NDB验证可选整数属性

Google app engine Google数据存储NDB验证可选整数属性,google-app-engine,google-cloud-datastore,app-engine-ndb,Google App Engine,Google Cloud Datastore,App Engine Ndb,如何验证空表单字段字符串'以将无指定给IntegerProperty class MyIntegerProperty(ndb.IntegerProperty): def _validate(self, value): if isinstance(value, basestring): if len(value) == 0 and self._required is False: return ????????????

如何验证空表单字段字符串
'
以将无指定给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()

它能比这更聪明吗?

验证程序可以生成属性值或引发异常,从而阻止保存实体。从表格中:

将使用参数(prop、value)调用,并且应返回 (可能是强制的)值或引发异常。呼叫 再次对强制值执行函数时,不应进一步修改该值。 (例如,返回value.strip()value.lower()是不正确的 很好,但不是值+“$”)也可能返回None,这意味着 “不变”。另见

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

  • 将属性值设置为
    None
    (例如,对于
    IntegerProperty
    ,这将失败)与删除属性不同(对于
    IntegerProperty
    ,完全可以)
  • 使用验证器时将属性值设置为
    None
    ,可能会很棘手,因为从验证器返回
    None
    意味着
    没有更改

因此,我相信您必须保持当前对该案例的处理。

验证程序可以生成属性值或引发异常,从而阻止保存实体。从表格中:

将使用参数(prop、value)调用,并且应返回 (可能是强制的)值或引发异常。呼叫 再次对强制值执行函数时,不应进一步修改该值。 (例如,返回value.strip()value.lower()是不正确的 很好,但不是值+“$”)也可能返回None,这意味着 “不变”。另见

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

  • 将属性值设置为
    None
    (例如,对于
    IntegerProperty
    ,这将失败)与删除属性不同(对于
    IntegerProperty
    ,完全可以)
  • 使用验证器时将属性值设置为
    None
    ,可能会很棘手,因为从验证器返回
    None
    意味着
    没有更改

因此,我相信您必须保留当前处理此案件的方法。

好的,我将保留当前的解决方案。我认为如果
None
对于
IntegerProperty
是无效的值,我希望我的
account.posint是None
返回
False
,这可能与验证器为什么不会用None调用有关。好的,我将保留当前的解决方案。我认为,如果
None
对于
IntegerProperty
是无效的值,我希望我的
account.posint是None
返回
False
,这可能与验证器为什么不会用None调用有关。
if len(request.form[name]) == 0:
    delattr(entity, name)
else:
    setattr(entity, name, request.form[name])