web2py grid delete

web2py中的grid是一个非常好用的东西。但是如果传给grid的查询是一个连接,也就是说会有多个表被查询并有选择的显示出几列时,这时候grid右边的delete到底会delete哪个表呢 ?
还有add的时候到底会以哪个表为基础进行添加呢?

这里的delete问题一定要搞清楚,因为一不小心,很多表里的数据都会被删掉了。
首先delete会选择一个表来做删除动作。如果有连接的话,它随便选一个,这个不是我们所需要的。为了给这个grid指定一个表名,可以用grid的参数field_id , 即如果表A/B/C参加了连接,但是我只想删除表A中的数据,并且不要顺带删除B/C中的相应的数据,那么需要设置field_id=db.A.id 。

另外,如果A中的列引用到了B/C中的列,那么缺省情况下,如果A中的数据被删除,B/C中相应的记录也会被删除。为了避免web2py这样作,可以在定义表的时候指定ondelete.注意,这里的ondelete参数只对引用的列有效。
下面是一个实例:


db.define_table(‘ta’,

         Field(‘code’,’string’))

db.define_table(‘ra’,

         Field(‘name’,’string’),

         Field(‘code_id’,’reference ta’,ondelete=”NO ACTION”))

#表ra引用表ta, 注意这里的ondelete, 如果没有这个参数,那么如果删除ra中的一行,ta中相应的行也会被删除
grid = SQLFORM.grid( (db.ta.id==db.ra.code_id),

                      fields=[db.ra.name,db.ta.code],

                      field_id=db.ra.id)

#注意这里的field_id,指明当前的表为ra,当用户点击grid上的删除按钮时,删除的ra的记录。而不是ta的记录。如果将field_id设为db.ta.id, 那么grid上的删除将是ta的记录。而上面的ondelete决定是否要删除其他表的行。


本文地址: http://www.bagualu.net/wordpress/archives/4032 转载请注明




发表评论

电子邮件地址不会被公开。 必填项已用*标注