2012-01-10 92 views
3

有沒有什麼辦法從查詢集中刪除select相關的?Django。從查詢集中刪除select_related

我發現,django在count()操作中添加JOIN到sql查詢。 所以,如果我們有這樣的代碼:

entities = Entities.objects.select_related('subentity').all() 
#We will have INNER JOIN here.. 
entities.count() 

我正在尋找一種方法,以消除加入。 一個重要的細節 - 我得到這個查詢集Django的進入分頁程序,所以我不能簡單地寫

Entities.objects.all().count() 

回答

1

你能告訴你需要這樣的代碼,我認爲重構是這裏最好的答案。

如果你想快速回答,entities.query.select_related = False,但它很hacky(如果你稍後需要select_related,不要忘記恢復該值)。

+1

我不認爲我們的情況需要重構。簡單情況 - 將實體列表插入分頁程序中。在一個查詢中使用count和inner join有點困惑,根本不需要它(相關表上沒有過濾器)。謝謝你的回答。而已。 – 2012-01-10 12:58:35

+0

據我所知,通過給select_related提供一個參數,你在相關表上指定了一個過濾器(如果你沒有爲select_related()指定任何參數,它將獲取所有相關對象,然後所有與這些對象相關的對象等遞歸)。 – 2012-03-29 21:43:39

1

我相信這個代碼的註釋提供了一個比較好的答案,一般的疑問,在這裏問:

如果select_related(無)被調用時,列表會被清除。

https://github.com/django/django/blob/stable/1.8.x/django/db/models/query.py#L735

在一般意義上,如果你想要做的事到entities查詢集,但首先從中取出select_related項目,entities.select_related(None)

但是,這可能無法解決您與paginator的特定情況。如果你做entries.count(),那麼它已經將刪除select_related項目。如果你發現自己有額外的JOIN發生,那麼它可能是幾個非理想的因素。可能是ORM無法刪除它,因爲其他邏輯可能會或可能不會影響與select_related結合的計數。

作爲其中一個非理想情況的簡單示例,請考慮Foo.objects.select_related('bar').count()Foo.objects.select_related('bar').distinct().count()。您可能很明顯知道原始查詢集不包含多個條目,但對於Django ORM並不明顯。因此,執行的SQL包含一個JOIN,並且沒有解決該問題的通用處方。即使應用.select_related(None)也不會幫助你。