web2py 防止多对多表中的重复
Posted
技术标签:
【中文标题】web2py 防止多对多表中的重复【英文标题】:web2py prevent duplicates in many to many table 【发布时间】:2017-02-22 05:03:06 【问题描述】:我有一张表来管理多对多关系(工人和技能) 工人可以拥有多种技能,一种技能可以分配给多个工人
什么是防止重复条目的最佳方法,因此一项技能不会两次分配给同一个工人?
谢谢
【问题讨论】:
【参考方案1】:如果你有类似的东西:
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 表单。
【讨论】:
在字段上添加验证器后,我失去了一个下拉菜单,因为我使用了两个验证器 db.workers_skills.ws_skill.requires = [IS_NOT_IN_DB(db(db.workers_skills.ws_worker == request.vars .ws_worker), 'workers_skills.ws_skill'), IS_IN_DB(db(db.skills.sk_organisation == org), db.skills.id, '%(sk_name)s', zero=T('Select Skill')) ] 本书中对此进行了介绍——IS_IN_DB
采用_and
参数——您可以使用该参数传递另一个验证器或验证器列表。以上是关于web2py 防止多对多表中的重复的主要内容,如果未能解决你的问题,请参考以下文章