【发布时间】:2017-02-22 05:03:06
【问题描述】:
我有一张表来管理多对多关系(工人和技能) 工人可以拥有多种技能,一种技能可以分配给多个工人
什么是防止重复条目的最佳方法,因此一项技能不会两次分配给同一个工人?
谢谢
【问题讨论】:
标签: duplicates many-to-many web2py data-access-layer
我有一张表来管理多对多关系(工人和技能) 工人可以拥有多种技能,一种技能可以分配给多个工人
什么是防止重复条目的最佳方法,因此一项技能不会两次分配给同一个工人?
谢谢
【问题讨论】:
标签: duplicates many-to-many web2py data-access-layer
如果你有类似的东西:
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 无法处理此问题,因此您必须通过外部工具执行此操作)。这对表单验证没有帮助,因为违反约束只会导致数据库驱动程序抛出异常(而不是向最终用户显示友好的错误消息),但如果您通过手段进行插入,它将很有用除了 web2py 表单。
【讨论】:
IS_IN_DB 采用_and 参数——您可以使用该参数传递另一个验证器或验证器列表。