我几个小时前发了一个问题,它被标记为重复(事实并非如此),我无法在这里找到答案,所以我必须在其他地方找到答案。
以下是问题: 如何简化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)
如何简化该代码?
答案 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)
Hoppe这可以帮助将来的某个人。