3

ルックアップからの値を使用して、モデル内のフィールドのバッチ更新を実行する方法があるかどうかを知りたいです。

次のモデルを想定します。

class Product(models.Model):
    price = models.DecimalField(... field params here ...)
    ... more fields here ...

class ShopcartProductEntry(models.Model):
    oncommit_price = models.DecimalField(
        ... field params here, similar to price params ...)
    quantity = models.IntegerField(... field params, doesn't matter here ...)
    product = models.ForeignKey(Product, null=False)
    shopcart = models.ForeignKey(
                   Shopcart, null=False, related_name='entries', ... more params ...)

class Shopcart(models.Model):
    ... fields here ...

    def commit(self):
        pass #my question will come in this method

ドキュメントが言うように、私が書くと:

    def commit(self):
        self.entries.update(oncommit_price=F('product__price'))

ジャンゴが泣く。どうすればそのクエリを実行できますか? 現在、各エントリを繰り返し処理しています。私はそれが好きではありません。

4

1 に答える 1

2

最後の手段として、いつでも独自の SQLUPDATEクエリを作成できます。

sql = ''' UPDATE myapp_shopcartproductentry SPE
          JOIN myapp_product P ON P.id = SPE.product_id
          SET SPE.oncommit_price = P.price
          WHERE SPE.shopcart_id = %s '''

そして、カスタム SQL トランザクションを使用して直接実行します。

def commit(self):
    sql = ''' ... SQL as above ... '''
    from django.db import connection, transaction
    cursor = connection.cursor()
    cursor.execute(sql, [self.id])
    transaction.commit_unless_managed()
于 2013-04-08T14:52:35.037 に答える