与另一个家伙一起开展项目。这是我在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's documentation,两者都等同于一个数据库查询。我可能错过了其他的东西。也许是我将停止变量(stops = ...
)设置两次这一事实?
因为直到星期一我才能抓住他,所以我以为我会去这个SO社区。 p>
答案 0 :(得分: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)
这就是你应该做的事情;)
答案 1 :(得分: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)`