google-app-engine - 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])
能比这更聪明吗?
解决方案
验证器可以生成属性值或引发异常,从而阻止实体被保存。从属性选项表中:
将使用参数(prop, value)调用,并且应该返回(可能是强制的)值或引发异常。对强制值再次调用该函数不应进一步修改该值。(例如,返回value.strip()或value.lower()很好,但不是value + '$'。)也可能返回None,这意味着“没有变化”。另请参阅编写属性子类
但是以上都不是您真正想要的,即删除该属性。注意:
- 设置属性值
None
(例如,对于 an 会失败IntegerProperty
)与删除属性不同(对于 an 来说完全可以IntegerProperty
) None
在使用验证器时设置属性值可能会很棘手,因为None
从验证器返回意味着no change
.
所以我相信你必须保持你目前对这个案子的处理。
推荐阅读
- xpath - 多个属性中单个属性的 CSS 选择器
- c - c99 -- 返回前的预期表达式
- javascript - 引导模式复制内容直到刷新
- c++ - 优先队列构造函数的作用
- computer-science - 如何设计 NPDA 来接受这些语言?
- javascript - JavaScript - 导入后 (webmix) 未捕获 ReferenceError: getJobData is not defined 错误
- node.js - 是否可以在控制台中一键重启我的 DIScordBot?
- python - 如何将列表文本中的数字与字母分开
- python-3.x - 分离 Tkinter GUI 和应用程序的控制
- java - 如何对 API 进行单元测试?