Google数据存储区NDB验证可选的IntegerProperty

时间:2018-11-26 15:07:03

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

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

Docs say

  

_validate(),_ to_base_type()和_from_base_type()不会出现的情况   需要处理:

     

无:不会用无调用它们(如果返回无,则此   表示该值不需要转换。

我当前正在做的是手动处理此案:

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

会比这更聪明吗?

1 个答案:

答案 0 :(得分:2)

验证器可以产生属性值或引发异常,从而阻止保存实体。在Property Options表中:

  

将使用参数(prop,value)调用,并且应该返回   (可能是强制的)值或引发异常。呼叫   对强制值再次执行功能时,不应进一步修改该值。   (例如,返回 value.strip() value.lower()是   ,但不是值+'$'。)还可能返回 None (无),这意味着   “不用找了”。另请参见Writing Property Subclasses

但是上述所有都不是您真正想要的,即删除该属性。请注意:

  • 设置属性值None(例如,对于IntegerProperty会失败)与删除属性(对于IntegerProperty完全正确)不同/ li>
  • 在使用验证器时将属性值设置为None可能很棘手,因为从验证器返回None意味着no change

因此,我相信您必须继续处理此案。