Django python优化过滤器查询

2024-05-02 13:22:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

对于其他参数,如高度等,使用相同的代码块

如何优化此代码并消除代码重复


Tags: 代码agesearch参数getifrequestrange
1条回答
网友
1楼 · 发布于 2024-05-02 13:22:12

这取决于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})

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

相关问题 更多 >