如何使用 Google appengine ndb 跨属性进行验证?

How can I validate across properties using Google appengine ndb?

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

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

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

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

文档显示 validator option 但这不适用于各个字段。

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

this does not prevent someone updating the banana to an impossible state.

Datastore 自身提供了几乎零架构实施。

您可以打开您的数据存储 (https://console.cloud.google.com/datastore/entities) select 实体的 Web 控制台并开始删除它的属性,即使您 ndb 代码有 required=True 在定义 属性

在图片中,我可以将字段 completed 编辑为布尔值而不是日期时间,然后每次通过 ndb.[=23 获取该实体时,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 代码

访问数据库时才有效