2014-12-04 20 views
0

我有一個過程,需要進行多個查詢,但他們都有一些共同的東西,所以我試圖優化它通過做一個更大的查詢一次這將包含所有信息,然後從中進行子查詢。問題是,當我檢查執行的SQL它仍然擊中每個子查詢的數據庫。做一個查詢命中數據庫,然後使其他人從它沒有擊中

首先,我必須問,在當前版本中是否可以使用Django,如果可以使用舊版本(在1.4.x中有Got和app),我該​​怎麼做?

的邏輯是比這更復雜,它還有另一個與另一對象,但想法是:

#I need it to hit the db here: 
big_query = MyModel.objects.filter(something = something) 

for object in another_model_query_set: 
    ... 
    #I need it not to hit the db here: 
    sub_query = big_query.filter(another_something = object.something) 
    ... 

感謝您的時間

回答

1

如果你不想打數據庫,並且您確信所有數據都包含在第一個查詢中,您需要使用純Python進行過濾。

sub_query = [obj for obj in big_query if obj.something = another_something] 

等等。請注意,這將返回一個列表而不是查詢集,並且您將無法使用任何標準查詢集方法(如排序;再次,你需要用標準的Python排序方法來做到這一點。

+0

我認爲這應該是'[OBJ的OBJ在big_query中如果obj.another_something == object.something]'。 – 2014-12-04 15:43:38

+0

因爲我沒有django的方式來做它我做了類似的純python,但創建一個字典,所以我可以更有效地訪問。不過,我想等一下,看看有人使用查詢集給我另一個答案。 – steven2308 2014-12-05 16:34:18

0

,如果你還沒有havenot閱讀about Queryset evaluation

模板

可以使用with緩存在它的查詢集和循環沒有擊中分貝。

{% with cached_queryset=object.related_name.all %} 
    {% for object in cached_queryset %} 
     {# no db hit #} 
     todo 
    {% endfor %} 
{% endwith %} 

查看

你可以使用發電機,它只是真棒,this is priceless tutorial

sub_query = [obj for obj in big_query if obj.something == another_something] 

(丹尼爾複製)

+0

我只在視圖中需要它,所以我只用python做了類似的事情。 – steven2308 2014-12-05 16:35:45

相關問題