[英]Most efficient way to sort a Django QuerySet based on a form value
與另一個家伙一起開展項目。 這是我在view.py
編寫的一些代碼,用於基於某些表單數據對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的文檔 ,兩者都等同於一個數據庫查詢。 我可能錯過了其他的東西。 也許事實是我兩次設置了stops變量( stops = ...
)?
因為直到星期一我都無法抓住他,所以以為我將在這個月去SO社區。
不必要的優化。 除了:
# 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)
這就是你應該做的;)
您同事的解決方案應該只保存一條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)`
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.