是否有更好的方法来执行以下操作:
if column_sort == 'size':
if sort == 'desc':
results = results.order_by('-size')
else:
results = results.order_by('size')
elif column_sort == 'modified':
if sort == 'desc':
results = results.order_by('-last_modified')
else:
results = results.order_by('last_modified')
else:
if sort == 'desc':
results = results.order_by('-path')
else:
results = results.order_by('path')
results = results[:100]
例如,一种反转查询顺序的方法?
答案 0 :(得分:2)
你只需编写一次代码吗?
valid_column_sorts = ['size', 'last_modified', 'path']
if column_sort in valid_column_sorts:
if sort == 'desc':
column_sort = '-' + column_sort
results = results.order_by(column_sort)
哦,是的,我发现排序字段和值之间存在一些差异,在这种情况下,您需要一个简单的地图,例如results.order_by(col_map[column_sort])
答案 1 :(得分:1)
更好的方法是使用dict映射column_sort
:
d = {'size': 'size',
'modified': 'last_modified',
#... add more items as needed
}
现在你只需要在dict上调用get
,如果column_sort
的值不在字典中,则第二个参数指定一个默认值:
orderby = d.get(column_sort, "path")
对于sort
变量,只需添加'-'
作为必要:
orderby = '-' + orderby if sort == "desc" else orderby
现在只需执行它:
results = results.order_by(orderby)
答案 2 :(得分:0)
这应该说:
columns = dict(size='size', modified='last_modified')
column_sort = columns.get(column_sort, 'path')
order = lambda v: '-' if v == 'desc' else ''
results.order_by(order(sort) + column_sort)
它会将用户指定的列名转换为您的架构,并假设默认为“path”。