web2py的pyDAL中`required = True`和`IS_NOT_IN_DB`的等价

时间:2016-10-04 13:59:20

标签: web2py pydal

web2py图书提供了an example of modelling an image blog。与我的问题相关的代码行是:

db.define_table('image',
                Field('title', unique=True),
                Field('file', 'upload'),
                format = '%(title)s')

db.image.title.requires = IS_NOT_IN_DB(db, db.image.title)

该文本指出像db.image.title.requires这样的表达式是验证器。但是

  1. 并未明确表达式unique=True中的Field('title', unique=True)是否也是具有完全相同功能的验证器
  2. 验证器对数据库驱动的表单生成有何影响。

1 个答案:

答案 0 :(得分:1)

从书中可以看出:

  

请注意,requires=...在表单级别强制执行,required=True在DAL(插入)级别强制执行,而notnullunique和{{ 1}}在数据库级别强制执行。虽然它们有时看似多余,但在使用DAL编程时保持区别非常重要。

ondelete 会导致创建验证程序。当web2py首次在数据库中创建表时(假设您已启用迁移),它会导致将unique=True约束添加到数据库模式中。如果使用违反此约束的值调用DAL UNIQUE.insert()方法,则数据库将抛出错误(这将导致应用程序中出现Python异常)。

设置.update()会创建一个验证程序,当您(a)提交使用requires=IS_NOT_IN_DB(...)创建的表单或(b)调用DAL SQLFORM.validate_and_insert()时,将运行该验证程序方法。如果验证失败,则插入/更新根本不会发送到数据库,并且您不会获得Python异常,而只是失败的记录(在表单提交的情况下通常显示在表单上)。

如果您要通过表单进行插入和更新,最好使用验证器,因为它提供了正确的用户体验(即,在表单中显示错误消息)。设置.validate_and_update()以使数据库具有适当的模式也是一个好主意,以防您通过表单以外的方式(甚至可能在web2py或DAL之外)进行插入/更新。