简化Django中的多个可选过滤器

时间:2017-03-13 09:46:53

标签: python django

我几个小时前发了一个问题,它被标记为重复(事实并非如此),我无法在这里找到答案,所以我必须在其他地方找到答案。

以下是问题: 如何简化django中的许多可选过滤器。例如: model =" some_rare_model"

if max_speed:
   if year:
       if color:
           cars = Car.objects.filter(model=model,max_speed=max_speed,year=year,color__icontains=color)
       else:
           car = Car.objects.filter(model=model,max_speed=max_speed,year=year)
   else:
       if color:
           cars = Car.objects.filter(model=model,max_speed=max_speed,color__icontains=color)
       else:
           cars = Car.objects.filter(model=model,max_speed=max_speed)
else:
   if year:
       if color:
           cars = Car.objects.filter(model=model,year=year,color__icontains=color)
       else:
           car = Car.objects.filter(model=model,year=year)
   else:
       if color:
           cars = Car.objects.filter(model=model,color__icontains=color)
       else:
           cars = Car.objects.filter(model=model)

如何简化该代码?

2 个答案:

答案 0 :(得分:1)

虽然传递字典是一种很好的方法,但另一种方法如下所示。请记住,查询集在使用之前不会被评估,并且可以根据需要进行更改。 所以你可以做这样的事情

cars = Car.objects.filter(model=model)
if max_speed:
    cars = cars.filter(max_speed=max_speed)
if year:
    cars = cars.filter(year=year)
if color:
    cars = cars.filter(color__icontains=color)

你可以随心所欲地做多少。它非常冗长。

编辑:我注意到您还提到了查询集很懒。我仍然会在这里留下这个答案,因为它可能在将来帮助某人。

答案 1 :(得分:0)

要简化该代码,您可以使用字典。

例如,如果您想过滤那些包含"蓝色"的颜色的汽车:

cars = Car.object.filter(**{'color__icontains'='blue'})

因此,为了过滤颜色,年份和max_speed,如果给出我们可以构建这样的东西:

filters = {"model":'some_rare_model'}
if color:
    filters['color__icontains'] = color
if year:
    filters['year'] = year
if max_speed:
    filters['max_speed'] = max_speed
cars = Car.objects.filter(**filters)
与24相比,8行代码是一个很大的进步,也更加清晰。您甚至可以创建一个函数,该函数将返回包含所有键和值的字典,例如URL中的查询集,从而使代码更短。

您还可以继续过滤这些模型,甚至只会调用一次数据库(query sets are lazy

原始answer to my question

Hoppe这可以帮助将来的某个人。