【问题标题】:Google Datastore NDB validate optional IntegerPropertyGoogle Datastore NDB 验证可选 IntegerProperty
【发布时间】:2018-11-26 15:07:02
【问题描述】:

如何验证空表单字段字符串 '' 以将 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() 没有的东西 需要处理:

None:它们不会被 None 调用(如果它们返回 None,这 表示该值不需要转换)。

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

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

能比这更聪明吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    但是以上都不是你真正想要的,那就是删除属性。请注意:

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

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

    【讨论】:

    • 好的,我会保留我当前的解决方案。我会争辩说,如果NoneIntegerProperty 的无效值,我希望我的account.posint is None 返回False
    • 可能与为什么不会使用 None 调用验证器有关。
    猜你喜欢
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 2017-04-13
    • 2015-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多