2017-05-31 64 views
0

我使用的1.8版因爲無法Django的慢查詢中使用相關的設置

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) 

我只需要列出的PurchaseOrder記錄其default_code(在產品Product模型)爲空。

使用「purchaseorderline_set.product_id_set.default_code =無」 因爲purchaseorderline_set我不能過濾是一個查詢集和它不具有一個屬性 product_id_set所示here。所以我試着用這個:

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) 

但是它花了3秒多。我認爲這是一個考慮因素,因爲只有269個PurchaseOrder recs,396個PurchaseOrderLine recs和726個ProductProduct recs,所以我只有一個在我的DEV env中工作(機器不是很慢),而DB目前非常小。

我想有一種有效的方式,我沒有看到。

回答

0

很抱歉,如果它不能幫助你

# 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

喜@Nam阮,我覺得 pol_ids = POL.objects.filter(prod__in = PP).values_list ('id',flat = True) –

+0

是的,在查詢中創建一個id列表比較好。我只是展示了另一種查詢方式,不需要像上面那樣做複雜的事情 –

+0

我剛剛結束了使用「values_list('id',flat = True)」的方法。現在它快得多!謝謝 – Rmartin