0

私はこのコードのパフォーマンスを改善しようとしています:

orderitems = OrderItem.objects.filter(order__contact=contact)
for orderitem in orderitems:

    try:
        pv = ProductVariation.objects.get(product=orderitem.product)

        if pv.parent_id == parent_product.id:
            return True
    except:
        pass

基本的に、「for」ループは遅いので削除したいと思います。可能であれば単一のクエリセットを使用して実行したいのですが、構文について頭を悩ませることはできません。これが私が効果的に再現したいSQLです。それはかなり短いリストを作成するので、一致するものを探してそれを繰り返すことができます:

SELECT parent_id
FROM configurable_productvariation
WHERE product_id IN (
    SELECT product_id
        FROM shop_orderitem
        WHERE order_id
        IN (
            SELECT id
            FROM shop_order
            WHERE contact_id = 4));

「4」は、Pythonの最初の行で参照されている「連絡先」です。

どうもありがとう、トーマス

4

1 に答える 1

0

これはあなたのようなSQLを生成するはずです

product_ids = OrderItem.objects.filter(order__contact=contact).values_list('product_id', flat=True)
ProductVariation.objects.filter(product_id__in=product_ids)
于 2012-04-29T18:17:19.540 に答える