在 web2py 中复制记录及其引用

Posted

技术标签:

【中文标题】在 web2py 中复制记录及其引用【英文标题】:Duplicate a record and its references in web2py 【发布时间】:2012-09-03 11:26:48 【问题描述】:

在我的 web2py 应用程序中,我需要复制一条记录及其所有引用。 例如 一个用户有一个产品(sponserid 是用户)。而且这个产品有很多存储在其他表中的特性(参考产品ID)。

我的要求是,如果另一个用户正在复制这个产品,新的记录将在产品表中生成,新的 productid 和新的 sponserid。并且所有参考表记录也将与新产品 id 重复。实际上,在所有表中都创建了一个重复条目,唯一的变化是产品 ID 和赞助商 ID。

产品表字段将发生变化。所以我必须写一个动态查询。

如果我可以编写如下代码

product = db(db.tbl_product.id==productid).select(db.tbl_product.ALL).first()
newproduct = db.tbl_product.insert(sponserid=newsponserid)
for field,value in product.iteritems():
    if field!='sponserid':
        db(db.tbl_product.id==newproduct).update(field=value)

但我不能在更新函数中引用这样的字段名称。

另外我想知道是否有任何其他更好的逻辑来实现这个要求。 如有任何建议,我将不胜感激。

【问题讨论】:

【参考方案1】:

对于字段名存储在变量中时使用.update()方法的具体问题,可以这样做:

db(db.tbl_product.id==newproduct).update(**field: value)

但更简单的方法是这样的:

product = db(db.tbl_product.id==productid).select(db.tbl_product.ALL).first()
product.update(sponserid=newsponserid)
db.tbl_product.insert(**db.tbl_product._filter_fields(product))

应用于Row 对象的.update() 方法只更新Row 对象,而不是数据库中的原始记录。表的._filter_fields() 方法获取一条记录(RowStorage 或普通dict)并返回一个仅包含属于表的字段的字典(它还过滤掉id 字段, db 将自动生成)。

【讨论】:

谢谢 Anthony,'_filter_fields()' 是解决我问题的最佳方案。

以上是关于在 web2py 中复制记录及其引用的主要内容,如果未能解决你的问题,请参考以下文章

Web2py MySQL数据库引用错误

默认情况下,级联上的 web2py 数据库抽象层 (DAL) 引用是啥?

当子表引用父表时,web2py 的 DAL 会自动创建前向引用吗?

MEF - 插件及其引用的程序集

如何更新引用重复记录的表?

ImportError:无法导入名称secure_dumps