django python优化过滤查询

时间:2017-04-02 20:56:48

标签: python django python-3.x

我有几个参数: 年龄,身高,体重等。

我需要通过这个参数进行搜索。 现在我可以这样做:

persons.vip = Person.get_vip()
params.search.age = request.GET.get('age')
    if params.search.age:
        range = params.search.age
        persons.vip = persons.vip.filter(age__gte=range)
    else:
        do somethin

params.search.weight= request.GET.get('weight')
    if params.search.weight:
        range = params.search.weight
        persons.vip = persons.vip.filter(age__gte=range)
    else:
        do somethin

与高度等其他参数相同的代码块。

如何优化此代码并摆脱代码重复?

1 个答案:

答案 0 :(得分:0)

这取决于您do somethin阻止的内容。

如果我们认为它是空的,你可以有一个简单的地图,如:

param_filters_map = {
    'weight': 'age__gte',
    'height': 'weight__gte', 
    ...}

然后迭代它:

for request_param_name, filter_name in param_filters_map.items():
    request_param = request.GET.get(request_param_name):
    if request_param:
        persons.vip = persons.vip.filter(**{filter_name: request_param})

如果它不是空的,我会试着想一想是否可以在之前那些块中应用逻辑来循环参数(如果有的话)我们应该用请求参数覆盖的一些默认行为。