如何使用 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
代码
访问数据库时才有效
假设我有一个 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
代码