【问题标题】:Parse value to None in ndb custom property在 ndb 自定义属性中将值解析为 None
【发布时间】:2013-08-13 08:28:16
【问题描述】:

我有一个自定义的 ndb 属性子类,它应该将一个空字符串解析为 None。当我在 _validate 函数中返回 None 时,会忽略 None 值,仍然使用空字符串。
我可以以某种方式将输入值强制转换为无吗?

class BooleanProperty(ndb.BooleanProperty):
    def _validate(self, value):
        v = unicode(value).lower()
        # '' should be casted to None somehow.
        if v == '':
            return None
        if v in ['1', 't', 'true', 'y', 'yes']:
            return True
        if v in ['0', 'f', 'false', 'n', 'no']:
            return False
        raise TypeError('Unable to parse value %r to a boolean value.' % value)

【问题讨论】:

  • 你需要显示一些代码,你可以在一些属性中存储None。例如,您是否正确地对属性进行了子类化。您需要提供更多信息。
  • 你的做法是错误的 - 请参阅属性子类的文档 - 它说 _validate()、_to_base_type() 和 _from_base_type() 不需要处理:无:他们不会用 None 调用(如果他们返回 None,这意味着该值不需要转换)。
  • 另外提供一个自定义验证器,您不需要对属性进行子类化,只需在声明属性时提供一个验证器。
  • 你真正想要达到什么目的? True、False 的值以及取消设置 bool 的能力,即重置为 None ?
  • 我正在尝试直接从 api 调用解析值。 api 参数中的空字符串应将值设置为 None。

标签: python google-app-engine app-engine-ndb


【解决方案1】:

也许您正在寻找类似 ndb.ComputedProperty 的东西?

class YourBool(ndb.Model):
    my_input = StringProperty()
    val = ndb.ComputedProperty(
        lambda self: True if self.my_input in ["1","t","True","y","yes"] else False)

【讨论】:

    【解决方案2】:

    我的实现覆盖了 _set_value 方法。这在 Appengine 文档中没有记录,但它确实有效。

    class MyBooleanProperty(ndb.BooleanProperty):
        def _set_value(self, entity, value):
            if value == '':
                value = None
            ndb.BooleanProperty._set_value(self, entity, value)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2015-06-16
      相关资源
      最近更新 更多