car*_*ier 9 web2py unique-constraint
可以将特定列标记为unique = true.在web2py中处理多列唯一约束的最正确方法是什么?
例如,假设我有一个汇率表.它可以包含从货币到货币和汇率的列.拥有两个具有相同from和to货币的行是没有意义的.什么是最优雅或最正确的方式来使/从组合独特?
假设数据将通过表单输入,您可以使用表单验证器,如下所示:
db.define_table('rates',
Field('from_currency'),
Field('to_currency'))
db.rates.to_currency.requires=IS_NOT_IN_DB(
db(db.rates.from_currency==request.vars.from_currency), 'rates.to_currency')
Run Code Online (Sandbox Code Playgroud)
这将确保to_currency在from_currency匹配from_currency插入的新值的记录集中是唯一的(因此组合from_currency且to_currency必须是唯一的).
另一种选择是使用onvalidation函数来确认两个值是不同的 - 这将在通常的表单验证之后但在DB插入之前运行.
最后,您可以通过Javascript进行验证客户端.
小智 5
您也可以尝试使用Before和After回调.以Anthony的表为例,您可以执行以下操作:
db.rates._before_insert.append( lambda r : db( (db.rates.from_currency==r["from_currency"]) & (db.rates.to_currency==r["to_currency"]) ).select() )
Run Code Online (Sandbox Code Playgroud)
如果.select()查询返回除了None或之外的任何内容False,它将中止当前db.rates.insert()并False作为返回给出.请注意,它仍然不会创建UNIQUE CONSTRAINT,但它比使用某些客户端验证更安全.
| 归档时间: |
|
| 查看次数: |
2162 次 |
| 最近记录: |