基于表单值对Django QuerySet进行排序的最有效方法

时间:2010-11-14 01:17:59

标签: python django-queryset

与另一个家伙一起开展项目。这是我在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社区。

2 个答案:

答案 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)`