2017-07-02 25 views
0

我在我的觀點一個具有操作減少數據庫訪問時,在多個類似的對象相同的查詢

order_details = [order.get_order_details() for order in orders] 

現在order.get_order_details()運行一個數據庫查詢。所以對於目前的情況。根據orders的大小,數據庫訪問的數量將非常龐大。

在使用緩存之前,有什麼可以加快速度的嗎?

是否有可能將所有選擇操作合併到一個數據庫操作中?

使用transaction.atomic()將使其成爲原子事務增加任何性能?因爲從技術上來說,查詢將立即發送而不是單獨發送,對嗎?

編輯:是否有任何設計更改/模式可以避免這種情況?

編輯:

def get_order_details(self): 
    items = Item.objects.filter(order=self) 
    item_list = [item.serialize for item in items] 
    return { 
     'order_details': self.serialize, 
     'item_list': item_list 
    } 
+1

你想['select_related'(https://docs.djangoproject.com/en/1.11/ref/models/querysets/#select-related)或者是'prefetch_related '(正下方) –

+1

哦,那麼我們需要看看'get_order_details'是什麼樣的。我唯一的猜測是使用'__in'運算符。我無法做出比猜測更少的信息。 –

+0

對不起,我誤解了你之前的評論。我以爲你說過在訂單上使用select_related。我認爲可以通過它解決。謝謝:)請把它作爲答案,我可以接受它。 –

回答

1

假設ordersQuerySet,例如Order.objects.filter(...)的結果,加上:

.prefetch_related(Prefetch('item_set')) 

到查詢結束。然後使用:

items = self.item_set 

in get_order_details

在這裏看到的文檔:https://docs.djangoproject.com/en/1.11/ref/models/querysets/#prefetch-related

+0

項目是一個帶外鍵的模型。這會繼續嗎? –

+0

@SidhinThomas,這是我的想法,所以我認爲是。順便說一句,如果你已經複製了代碼,那麼我會犯一個錯字,它的'self.item_set'不是'self.items_set'。 –

+0

這是更優雅的解決方案,在'Item'上使用'select_related'並檢索我剛剛實現的細節。謝謝 –

相關問題