2017-01-16 78 views
0

正在使用這種長查詢的一個好方法? 還是應該以其他方式完成? 這對SQL(postgres)有好處嗎?Django模型查詢是否正確?

goodbills = Billinfo.objects.filter(
    status=20, 
    lead_id__in=Lead.objects.filter(
     link_id__in=Link.objects.filter(
      partner=self.id, 
      landing=eachlanding 
     ).values_list('id') 
    ).values_list('id') 
).count() 
+0

顯示您的模型沒有,很難判斷關係btw模型。 – shuboy2014

回答

1

Theres沒有提供您的用例的長查詢錯誤需要它,但是您的查詢顯示包含大量不必要的內部數據庫查詢來找出你想用__in搜索什麼。您應該可以將其重寫爲以下內容。

goodbills = Billinfo.objects.filter(status=20, 
            lead__link__partner=self.id, 
            lead__link__landing=eachlanding).count() 

這消除了檢索鏈接對象和引導對象(並在我看來更容易理解)的需要。

+1

是的,它的工作就像一個魅力,我應該深入瞭解它似乎的文檔。再次感謝你。 – Baks

+0

@Baks - 不用擔心,盡情享受吧! – Sayse

0

爲了使它們易於閱讀和維護以及防止數據庫引擎工作太辛苦,保留查詢通常是個好主意。但是,有時您必須運行復雜的查詢,而且您可以執行的操作並不多。

不知道您的ERD(實體關係圖),很難評論如何更好地構建該查詢。但最起碼,我會做這樣的事情:

link_ids = Link.objects.filter(partner=self.id, landing=eachlanding) 
lead_id = Lead.objects.filter(link_id__in=link_ids).values_list('id')).values_list('id') 

goodbills = Billinfo.objects.filter(status=20, lead_id__in=lead_ids) 

這將確保前兩個查詢不運行的每個調用goodbills查詢時間。