SQLAlchemy声明式模型的数据验证

13
我正在使用CherryPy、Mako模板和SQLAlchemy开发Web应用程序。我以前使用Ruby on Rails,现在想为我的模型设置一些数据验证。例如,当其他字段有值时,我无法确定如何最好地确保“名称”字段具有值。我尝试使用SAValidation,但它允许我创建新行,即使我在列上使用了validates_presence_of,该列是必需的但是空白的。我一直在看WTForms,但那似乎涉及大量重复的代码——我已经设置了我的模型类,其中包含表中的列,为什么我需要重复所有这些列,只是为了说“嘿,这个需要一个值”?我来自“瘦控制器,胖模型”的思维方式,并一直在寻找像validates_presence_ofvalidates_length_of这样的Rails-like方法。我应该如何验证我的模型接收到的数据,并确保Session.add/Session.merge在验证失败时失败?
4个回答

16

请查看添加验证方法的文档(validation methods)。您可以添加一个“update”方法,该方法接受POST字典,确保必需的键存在,并使用装饰器验证器设置值(如果有任何问题则会引发错误)。


1
验证方法一次只能针对一个字段进行操作。他显然是指依赖于字段之间关系的验证。 - Pedro Werneck
通过以下方式处理多个字段:(a) 在装饰器中列出您想要验证的所有字段 @validates('validates_presence_of', 'validates_length_of')(b) 确保您的验证触发在字段列表中最后一个声明的字段上,以便其他字段已经设置好了 if key == 'validates_length_of': [code to validate] - naoko

3
我为了避免在验证模型数据时出现代码重复而编写了SAValidation,对于我们的用例来说,它运行良好。
在我们的测试中,我们有模型设置的示例和测试以展示验证的效果。

0

API Logic Server 为 SQLAlchemy 模型提供业务规则。这不仅包括多字段、多表验证,还包括多表验证。它是开源的。


-5

最终我还是决定使用WTForms。


你是如何避免代码重复的?能否解释一下你是如何使用它的?我也是Rails开发人员,但想要使用Flask+SQLAlchemy开发应用程序...我看过WTForms,但它似乎对我来说有点陌生,因为你总是将验证存储在视图中...而将其存储在模型中更加有效(也更加DRY)。 - jbwiv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接