0

有没有更好的方法来执行以下操作:

    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]

例如,一种反转查询顺序的方法?

4

3 回答 3

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])

于 2013-02-03T20:52:08.343 回答
1

更好的方法是使用 dict 来映射 的值column_sort

d = {'size': 'size',
     'modified': 'last_modified',
     #... add more items as needed
    }

现在您只需要调用字典,如果字典中的值不在,则get使用第二个参数指定默认值:column_sort

orderby = d.get(column_sort, "path")

对于sort变量,只需根据需要添加'-'

orderby = '-' + orderby if sort == "desc" else orderby

现在只需执行它:

results = results.order_by(orderby)
于 2013-02-03T20:54:25.593 回答
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)

它会将用户指定的列名转换为您的架构,并假定默认值为“路径”。

于 2013-02-03T20:53:56.087 回答