首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`required=True`和`IS_NOT_IN_DB`在web2py's pyDAL中的应用

`required=True`和`IS_NOT_IN_DB`在web2py's pyDAL中的应用
EN

Stack Overflow用户
提问于 2016-10-04 13:59:20
回答 1查看 346关注 0票数 0

web2py的书给了图像博客建模的一个例子。与我的问题有关的代码行如下:

代码语言:javascript
复制
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是否也是一个具有完全相同功能的验证器。
  2. 验证器对数据库驱动的表单生成有什么影响。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-04 17:58:27

从书中:

请注意,requires=...是在表单级别强制执行的,required=True是在DAL (insert)级别强制执行的,而notnulluniqueondelete是在数据库级别强制执行的。虽然它们有时看起来是多余的,但是在使用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之外)进行插入/更新。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39854296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档