簡體   English   中英

基於表單值對Django QuerySet進行排序的最有效方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM