2010-11-14 53 views
0

使用另一個傢伙處理項目。這是一些代碼,我在view.py寫信給排序基於某種形式的數據的查詢集:基於表單值對Django QuerySet進行排序的最有效方法

# Get sort by value 
sort_by = search_form.cleaned_data.get('sort_by', SORT_BY_LAST_VISIT) 

# Gather stops 
stops = Stops.approved_objects.filter(**query_attributes) 

# Do neccessary sorting 
if sort_by == SORT_BY_PRICE: 
    stops = stops.order_by('price') 
else: # By default, sort by last visted 
    stops = stops.order_by('last_visited') 

然而,昨天晚上我的同事修改了代碼,以這樣的:

# Get sort by value 
sort_by = search_form.cleaned_data.get('sort_by', SORT_BY_LAST_VISIT) 

# Gather stops based on sort 
if sort_by == SORT_BY_PRICE: 
    stops = Stops.approved_objects.filter(**query_attributes).order_by('price') 
else: # By default, sort by last visted 
    stops = Stops.approved_objects.filter(**query_attributes).order_by('last_visited') 

他SVN評論:More efficient

根據Django's documentation,兩者將相當於一個數據庫查詢。有可能我錯過了別的東西。也許事實上,我設置了兩次停止變量(stops = ...)?

因爲我不能把他抱到星期一,我以爲我會去這個社區。

回答

1

不必要的優化。再說:

# settings.py 
SORTS = {SORT_BY_PRICE: 'price'} 
DEFAULT_SORT = 'last_visited' 

# whatever.py 
sort_field = settings.SORTS.get(sort_by, settings.DEFAULT_SORT) 

stops = Stops.approved_objects.filter(**query_attributes).order_by(sort_field) 

這是你應該做的事情;)

+0

+1。像往常一樣,@Ignacio非常有責任感。 – 2010-11-14 01:39:48

1

你的同事的解決方案只能救一個STORE_FAST指令(假設這是一個功能,如果它是全球比它的一個STORE_GLOBAL)和一個LOAD_FAST。 (或LOAD_GLOBAL指令)。

我非常喜歡冒汗微微秒(當我知道如何),但不以犧牲可讀性爲代價。您的版本更具可讀性。

雖然,我願意爲改善的東西,我不知道需要改進做

sort_field = 'price' if sort_by == SORT_BY_PRICE else 'last_visited' 
stops = Stops.approved_objects.filter(**query_attributes).order_by(sort_field)` 
+0

是的,這是在view.py函數中。他的代碼給我尖叫前優化,並在我的偏見,不太可讀。我喜歡你的版本(+1),但我們會在不久的將來增加更多的SORT_BY_ *值。我假設你不會採取同樣的方法,對嗎? – 2010-11-14 01:45:43

+0

@Nimmy絕對正確。有了兩個以上的值,Ignacio's絕對是正確的方法。對於只有兩個值,根據「==」的實現方式,我的(我認爲)就像可讀和快速一樣。爲了更多,他的意志會更好。 – aaronasterling 2010-11-14 01:57:07

相關問題