2017-03-02 100 views
1

我有一個模型所有對象的查詢集。對對象進行迭代,我將刪除列中值爲重複的更新行。因此,無需再次訪問數據庫,我想從更大的查詢集中刪除更新的行。從django中較大的查詢集中排除查詢集而不碰到數據庫

什麼是最有效的方法來做到這一點?

+0

最好讓SQL篩選原始列表。它被優化來比你更有效地執行WHERE子句。 – duffymo

+0

這是真的,其實我在SQL中嘗試過類似的東西,但這需要太多的時間和CPU使用。我不擅長SQl :( – sprksh

+0

太多時間了嗎?這會向我建議你的模式缺少索引。在SQL上運行EXPLAIN PLAN並查找表掃描。 – duffymo

回答

0

您可能需要提供有關您的特定用例的更多信息,但一般來說,Django會將查詢集的評估推遲到實際需要的時候。如果您能夠獨立於較大的QuerySet構建排除集的QuerySet,則可以調用.exclude()方法並生成一個較大的查詢,而不是兩個較小的查詢。例如:

excluded_set = Model.objects.filter(...) 
large_set = Model.objects.filter().exclude(id__in=excluded_set) 
+0

不,我在詢問如果沒有點擊數據庫 – sprksh

+0

糾正我,如果我錯了,但排除,像過濾器,並沒有實際評估一個查詢集 - 「__in」查找是否改變?最好我能找到(見綠色框):https://docs.djangoproject。 COM/EN/1.10/REF /模型/查詢集/#在 – Hybrid