按可选的开始日期和结束日期过滤查询集

时间:2017-01-09 02:01:28

标签: python django django-queryset django-orm django-1.10

我想按日期范围过滤查询集,其中开始日期和结束日期都是可选的。具体来说,

if dt_from:
    results = results.filter(date_modified__gte=dt_from)
if dt_until:
    results = results.filter(date_modified__lte=dt_until)

其中dt_fromdt_until分别为datetime.datetimedatetime.dateNone。关于链接多个过滤器的行为的文档是非常混乱的(参见Chaining multiple filter() in Django, is this a bug?),我不确定上面做了我认为它做的事情(它可能是OR过滤器而不是ANDing它们)。 / p>

上面的代码是否实现了我想要的(即AND两个过滤器),还是我应该采用另一种方式?

1 个答案:

答案 0 :(得分:1)

我有这种问题的通用解决方案。对所有模型重用此custom queryset

class MyQuerySet(models.QuerySet):

    def filter_if(self, **kwargs):
        new_kwargs = {a: b for (a, b) in kwargs.items() if b}
        return self.filter(new_kwargs)

results.filter_if(date_modified__gte=dt_from, date_modified__lte=dt_until)