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
这样的表达式是验证器。但是
unique=True
中的Field('title', unique=True)
是否也是具有完全相同功能的验证器答案 0 :(得分:1)
从书中可以看出:
请注意,
requires=...
在表单级别强制执行,required=True
在DAL(插入)级别强制执行,而notnull
,unique
和{{ 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之外)进行插入/更新。