2012-04-29 2 views
0

Je suis en train d'améliorer les performances de ce code:queryset équivalent de SQL

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 

Essentiellement, je veux se débarrasser de la boucle « pour » parce que son lent. Je voudrais le faire en utilisant un seul jeu de requête si possible, mais je n'arrive pas à comprendre la syntaxe. Voici le SQL que je veux effectivement reproduire. Il crée une liste qui est assez court, je peux itérer que la recherche d'un match:

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)); 

Le « 4 » est le « contact » mentionné dans la première ligne de python.

Un grand merci, Thomas

+0

BTW, je ne pense pas que votre exemple python correspond requête SQL. Êtes-vous sûr de 'return True'? – San4ez

Répondre

0

Cela devrait générer sql comme le vôtre

product_ids = OrderItem.objects.filter(order__contact=contact).values_list('product_id', flat=True) 
ProductVariation.objects.filter(product_id__in=product_ids) 
+0

Merci San4ez! Cela a résolu mon problème :) Je devais juste faire quelques petits changements. Il est devenu ceci: ** product_ids = OrderItem.objects.filter (order__contact = contact) .values_list ('product', flat = True) ** et ** ProductVariation.objects.filter (product__in = product_ids) ** Je ne sais pas Sachez pourquoi product_id doit devenir un produit, mais cela fonctionne. – handros