web2py的书给了图像博客建模的一个例子。与我的问题有关的代码行如下:
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是否也是一个具有完全相同功能的验证器。发布于 2016-10-04 17:58:27
从书中:
请注意,
requires=...是在表单级别强制执行的,required=True是在DAL (insert)级别强制执行的,而notnull、unique和ondelete是在数据库级别强制执行的。虽然它们有时看起来是多余的,但是在使用DAL编程时保持这种区别是很重要的。
unique=True不会导致创建验证器。当UNIQUE第一次在数据库中创建表时(假设您已经启用迁移),它将导致将一个UNIQUE约束添加到数据库模式中。如果您使用违反此约束的值调用DAL .insert()或.update()方法,数据库将抛出一个错误(这将导致应用程序中的Python )。
设置requires=IS_NOT_IN_DB(...)将创建一个验证器,当您(a)提交使用SQLFORM创建的表单或(b)调用DAL .validate_and_insert()或.validate_and_update()方法时,验证器将运行。如果验证失败,则insert/update根本不会发送到数据库,您不会得到Python异常,而只是失败的记录(在表单提交的情况下,通常显示在表单上)。
如果要通过表单进行插入和更新,那么最好使用验证器,因为它提供了适当的用户体验(即,在表单中显示错误消息)。设置unique=True也是个好主意,这样数据库就有了合适的模式,以防您通过表单以外的方式(甚至在web2py或DAL之外)进行插入/更新。
https://stackoverflow.com/questions/39854296
复制相似问题