2013-05-21 82 views
2

我想知道當我做查詢時觸摸db。更確切地說,是在查詢執行時:django - 如何與kwargs做到這一點

我有這個kwargs DIC:

kwargs = {'name__startswith':'somename','color__iexact':'somecolor'} 

但僅限於name__startswith查詢,我需要distinct()。而不是爲color__iexact

我想,我會在環路name__startswithdistinct()這樣設置:

for q in kwargs: 
    if q == 'name__startswith': 
    Thing.objects.filter(name__startswith=somename).distinct('id') 

,然後查詢所有動態:

allthings = Thing.objects.filter(**kwargs) 

但這是有點錯了,我似乎是在這裏做兩件不同的事情..

我該如何動態地做這兩個查詢?

回答

4

Django的查詢集爲lazy,因此實際查詢不evaluated until you use the data.

allthings = Thing.objects.filter(**kwargs) 

if 'name__startswith' in kwargs: 
    allthings = allthings.distinct('id') 

沒有查詢應上述unitl你實際使用的數據進行預製。 - 創建一個查詢集不涉及任何數據庫活動的行爲

查詢集是懶惰:你希望做


docs這是偉大的過濾查詢。您可以整天將過濾器堆疊在一起,並且在評估QuerySet之前,Django不會真正運行查詢。看看這個例子:

>>> q = Entry.objects.filter(headline__startswith="What") 
>>> q = q.filter(pub_date__lte=datetime.date.today()) 
>>> q = q.exclude(body_text__icontains="food") 
>>> print(q) 

雖然這看起來像三個數據庫訪問,實際上它訪問數據庫只有一次,在最後一行(打印(Q))。一般來說,直到你「詢問」它們之前,QuerySet的結果都不會從數據庫中獲取。當你這樣做時,通過訪問數據庫來評估QuerySet。有關確切何時進行評估的更多詳細信息,請參閱何時評估QuerySet。

+0

感謝的人,我決定'上的所有查詢,這亙古不變的傷害任何'distinct''。感謝您的幫助無論如何 – doniyor

+1

使用'distinct'可以顯着減慢您的查詢:http://stackoverflow.com/questions/1977739/is-distinct-an-expensive-query-in-django –

1

您可以使用models.Q在django中創建動態查詢。

query = models.Q(name__startswith=somename) 

query &= models.Q('color__iexact':'somecolor') 

all_things = Thing.objects.filter(query).distinct('name') 

又讀 Constructing Django filter queries dynamically with args and kwargs

+0

但你是''distinct''也''color__iexact',我還需要'name__startswith' – doniyor

+0

不,不同,需要一個列名,你可以提供你想要有一個獨特的列。更新我的答案,以明確的名稱 –

+0

哦,好吧,太棒了。非常感謝。我對「Q」沒有任何瞭解。你給了我新的方法。謝謝。 – doniyor