更好的方式来进行条件django查询

时间:2013-02-03 20:44:49

标签: python mysql django

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

    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]

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

3 个答案:

答案 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”。