【问题标题】:How can I validate across properties using Google appengine ndb?如何使用 Google appengine ndb 跨属性进行验证?
【发布时间】:2020-04-27 11:20:06
【问题描述】:

假设我有一个具有两个属性的类,如下所示:

class Banana(ndb.Model):
    is_delicious = ndb.BooleanProperty(default=True)
    is_rotten = ndb.BooleanProperty(default=False)

一个烂的Banana条目不可能是美味的。如何防止将美味的烂香蕉保存到数据存储区?

我可以像在this answer 中一样覆盖__init__ 方法,但这并不能阻止某人更新香蕉到不可能的状态。

文档显示validator option,但这不适用于跨字段。

如何验证模型的两个字段以防止将对象保存为不正确的状态?

【问题讨论】:

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


    【解决方案1】:

    这不会阻止某人将香蕉更新为不可能的状态。

    Datastore 自行提供几乎为零的架构实施。

    您可以打开数据存储区 (https://console.cloud.google.com/datastore/entities) 的 Web 控制台,选择一个实体并开始从中删除属性,即使您在定义属性时 ndb 代码有 required=True 也是如此

    在图片中,我可以将字段 completed 编辑为布尔值而不是日期时间,然后每次通过 ndb 获取此实体时,appengine 都会抛出异常。

    所以我不知道你会在哪里。你可以走__init__路线

    你可以把支票放在_pre_put_hook:

    class Banana(ndb.Model):
        is_delicious = ndb.BooleanProperty(default=True)
        is_rotten = ndb.BooleanProperty(default=False)
        def _pre_put_hook(self):
            if self.is_delicious and self.is_rotten:
                raise Exception("A rotten Banana entry cannot be delicious")
    

    您可以让ComputedProperty 进行检查:

    class Banana(ndb.Model):
        is_delicious = ndb.BooleanProperty(default=True)
        is_rotten = ndb.BooleanProperty(default=False)
    
        def _is_valid(self):
            if self.is_delicious and self.is_rotten:
                raise Exception("A rotten Banana entry cannot be delicious")
            return True
    
        is_valid = ndb.ComputedProperty(lambda self: self._is_valid())
    

    但所有这些只有在您的ndb 代码访问数据库时才有效

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-03
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      相关资源
      最近更新 更多