0

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)

文本指出表达式 likedb.image.title.requires是验证器。但

  1. 不清楚unique=True表达式Field('title', unique=True)中是否也是具有完全相同功能的验证器
  2. 验证器对数据库驱动的表单生成有什么影响。
4

1 回答 1

1

从书中:

请注意,requires=...在表单级别required=True强制执行,在 DAL(插入)级别强制执行,而notnullunique数据库ondelete级别强制执行。虽然它们有时看起来是多余的,但在使用 DAL 编程时保持区别很重要。

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

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

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

于 2016-10-04T17:58:27.760 回答