web2py 防止多对多重复 table

web2py prevent duplicates in many to many table

我有一个 table 来管理多对多关系(工人和技能) 工人可以拥有多项技能,一项技能可以分配给多名工人

防止重复输入的最佳方法是什么,这样一项技能就不会分配给同一个工人两次?

谢谢

如果你有类似的东西:

db.define_table('worker_skill',
    Field('worker', 'reference worker'),
    Field('skill', 'reference skill'))

为了防止通过表单提交重复,您可以向其中一个字段添加验证器,例如:

db.worker_skill.skill.requires = IS_NOT_IN_DB(
    db(db.worker_skill.worker == request.vars.worker), 'worker_skill.skill'
)

以上将确保 "skill" 中插入的值不存在于 "worker" 中插入的值与 "worker" 字段匹配的记录集中。

表单验证的另一个选项是使用 onvalidation 回调,如本书 forms chapter 中所述。

您还可以直接在数据库中对这对列设置唯一约束(web2py 不处理该操作,因此您必须通过外部工具来完成)。这对表单验证没有帮助,因为违反约束只会导致数据库驱动程序抛出异常(而不是向最终用户显示友好的错误消息),但如果您通过 means 进行插入,它将很有用除了 web2py 形式。