【问题标题】:web2py prevent duplicates in many to many tableweb2py 防止多对多表中的重复
【发布时间】:2017-02-22 05:03:06
【问题描述】:

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

什么是防止重复条目的最佳方法,因此一项技能不会两次分配给同一个工人?

谢谢

【问题讨论】:

    标签: duplicates many-to-many web2py data-access-layer


    【解决方案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 参数——您可以使用该参数传递另一个验证器或验证器列表。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多