Django链式filter中如何实现条件匹配:-1时查全部否则匹配指定值
一行实现Django ORM条件过滤解决方案
你可以通过字典推导+关键字参数拆包的方式实现,代码如下:
qs = model.objects.filter(**{field: val for field, val in {"some_id": some_id_val, "some_id_2": some_id_val_2}.items() if val != -1})
实现原理
- 先将所有需要判断的过滤字段、对应参数值组装为临时字典
- 用字典推导式筛掉值为
-1的条目,仅保留需要生效的过滤条件 - 通过
**运算符将字典拆为关键字参数传入filter方法,自动忽略空字典的情况(即所有参数都为-1时等价于查询全量数据)
如果偏好使用Q对象实现,Django 3.2+版本可以直接使用空Q对象占位:
from django.db.models import Q qs = model.objects.filter( Q(some_id=some_id_val) if some_id_val != -1 else Q(), Q(some_id_2=some_id_val_2) if some_id_val_2 != -1 else Q() )
空Q对象不会产生任何过滤逻辑,完全符合你想要的参数为-1时跳过该字段过滤的需求。
内容的提问来源于stack exchange,提问作者Anirban Nag 'tintinmj'
相关产品推荐
相关产品推荐

