2017-05-31 1 views
0
mis

J'utilise la version 1,8Django requêtes lentes depuis ne peuvent pas utiliser liées

class ProductProduct(models.Model): 
    product_tmpl = models.ForeignKey(ProductTemplateModel) 
    default_code = models.CharField() 
    name_template = models.CharField() 
    ... 

class PurchaseOrder(models.Model): 
    # fields... 

class PurchaseOrderLine(models.Model): 
    id = models.IntegerField() 
    product_id = models.ForeignKey(ProductProduct) 
    order_id = models.ForeignKey(PurchaseOrder) 

Je ne ai besoin d'énumérer les dossiers purchaseOrder qui default_code (dans le modèle ProductProductQu'est) est nul.

Je ne peux pas filtrer à l'aide « purchaseorderline_set.product_id_set.default_code = Aucun » depuis purchaseorderline_set est une requête serties et ne dispose pas d'un attribut product_id_set comme indiqué here. J'ai donc essayé d'utiliser ceci:

orders_recs = PurchaseOrder.objects.all().order_by('-id') 
orders_recs = PurchaseOrder.objects.filter(purchaseorderline_set.product_id_set.default_code=None).order_by('-id') 
orders = [] 
for order_rec in orders_recs: 
    line = order_rec.purchaseorderline_set.all() 
    if line and line[0].product_id.default_code == None: 
     orders.append(order_rec) 

Mais cela prend plus de 3 secondes. Je considère cela comme un LOT prenant en considération que je suis seulement un travail dans mon DEV env (machine n'est pas lent) et DB est vraiment petit jusqu'à présent, car il n'y a que 269 rechts PurchaseOrder, 396 PurchaseOrderLine recs et 726 ProductProduct recs. Je suppose qu'il y a un moyen efficace que je ne vois pas.

Répondre

0

Désolé si elle ne vous aide pas

# pp:ProductProduct 
# po:PurchaseOrder 
# pol:PurchaseOrderLine 
# List PP with None 
pp = PP.objects.filter(def_c = None) 
# list pol have pp None 
pol = POL.objects.filter(prod__in = pp) 
# create a list ids of POL 
ids = [] 
for i in pol: 
    ids.append(pol.order_id) 
po = PO.objects.filter(id__in = ids) 
+1

salut @Nam Nguyễn, je pense pol_ids = POL.objects.filter (prod__in = p) .values_list ('id', flat = True) –

+0

oui, créer une liste d'id dans la requête est mieux. Je viens de montrer un autre moyen d'interroger, je n'ai pas besoin de faire la chose compliquée comme ci-dessus –

+0

Je viens de finir par utiliser la méthode avec "values_list ('id', flat = True)". Maintenant, c'est beaucoup plus rapide! Merci – Rmartin