2015-11-06 77 views
1

我想验证一个NDB模型。我的模型是这样的:Ndb模型验证与相互依赖的属性?

class Sample(ndb.Model): 
    x = ndb.IntegerField() 
    y = ndb.IntegerField() 

我想确保在任何时间点xy。

途径我曾尝试:

  1. 写入验证功能和覆盖的构造函数中调用它。但是,字段值可能会稍后更改。它应该验证每次它节省

  2. 添加一个_pre_put_hook - 但这似乎是矫枉过正。 - 该不会抛出错误,直到实体实际上是保存在数据存储

理想我想要的是,每当a或b改变 - 一个功能应被触发,这将验证该实体是其他有效抛出错误。

注意:目前我正在使用_pre_put_hook。

+2

_pre_put_hook不过分。我认为它比验证者更合适。如果您使用您的验证标准并且现有实体不再提供验证,您将无法检索验证,因为验证将失败。 –

+0

另外,确保x

+0

谢谢蒂姆。这有很大帮助。 –

回答

0

这应该在ndb.Model逻辑之外完成。

像下面的模型中只需创建一个函数:

class Sample(ndb.Model): 
    x = ndb.IntegerField() 
    y = ndb.IntegerField() 

    @classmethod 
    def new(cls, x, y): 
    if x >= y: 
     raise Exception 
    return cls(x=x, y=y) 

然后更换我有一个自定义使用的通用的异常,并用try块捕获它。

+0

此解决方案不会阻止在创建后将'x'或'y'更改为无效值。 –

+0

男人是一样的逻辑。定义一个名为update ...的新函数,它使用完全相同的验证..也许在DRY的辅助方法中。 – janscas