首页 > 解决方案 > Google Datastore 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])

能比这更聪明吗?

标签: google-app-enginegoogle-cloud-datastoreapp-engine-ndb

解决方案


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

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

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

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

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


推荐阅读