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 防止多对多表中的重复的主要内容,如果未能解决你的问题,请参考以下文章

防止 SQLAlchemy 中多对多关系中的重复表条目

从 Prisma 中的多对多表中获取元信息

如何在多对多表上级联删除

JOINing多对多表时避免SQL查询中的重复行

使用 EF4 CTP4 代码优先方法生成的多对多表中的命名约定

多对多表的设计小案例