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

标签 python django

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

问题是这样的: 如何简化 django 中的许多可选过滤器。例如: 型号 =“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)

如何简化该代码?

最佳答案

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

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)

您可以做任意多的事情。而且非常冗长。

编辑:我注意到您还提到查询集是惰性的。我仍然会在这里留下这个答案,因为它可能会对将来的某人有所帮助。

关于python - 简化 Django 中的多个可选过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42760593/

相关文章:

css - 生成动态 CSS

python - (Pygame/Python) 如何根据对象矩形的中间位置将对象放置在屏幕上?

python - 如何以非阻塞方式链接 future ?即,如何在不阻塞的情况下将一个 future 作为另一个 future 的输入?

javascript - 如何使用js验证输入并将输入存储在数据库中

python - 计算 sigmoid 最快的方法是什么?

Django makemigrations : ValueError: Lookup failed for model referenced by field

javascript - 运行 Submit() 两次以一次提交到不同的表单

django - 让当前用户在我的模型之一的save方法中使用它

python - SQLAlchemy 插入数据与关联表的多对多关系

python - Django 中的高级数据库查询