0

私のweb2pyアプリケーションでは、レコードとそのすべての参照を複製する必要があります。たとえば、1人のユーザーが製品を持っています(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)

しかし、更新関数でこのようなフィールド名を参照することはできません。

また、この要件を達成するための他のより良いロジックがあるかどうかを知りたいです。何か提案をいただければ幸いです。

4

1 に答える 1

3

フィールド名が変数に格納されているときにメソッドを使用するという特定の問題については.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))

.update()オブジェクトに適用されるメソッドは、データベース内の元のレコードではなくRow、オブジェクトのみを更新します。Rowテーブルの._filter_fields()メソッドは、レコード ( RowStorage、または plain dict) を受け取り、テーブルに属するフィールドのみを含む dict を返します (idデータベースが自動生成するフィールドも除外します)。

于 2012-09-10T20:53:47.577 に答える