我有几个参数: 年龄,身高,体重等。
我需要通过这个参数进行搜索。 现在我可以这样做:
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
与高度等其他参数相同的代码块。
如何优化此代码并摆脱代码重复?
答案 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})
如果它不是空的,我会试着想一想是否可以在之前那些块中应用逻辑来循环参数(如果有的话)我们应该用请求参数覆盖的一些默认行为。