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

Posted

技术标签:

【中文标题】按可选的开始和结束日期过滤查询集【英文标题】:Filter queryset by optional start and end date 【发布时间】:2017-05-23 05:44:45 【问题描述】:

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

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 它们)。

上面的代码是否实现了我想要的(即和两个过滤器)还是我应该这样做的另一种方式?

【问题讨论】:

如果您采用这种方法,请不要忘记更新results 变量:results = results.filter(date_modified__gte=dt_from)results = results.filter(date_modified__lte=dt_until) @alecxe 对,谢谢 :) 那个链接的问题根本不相关,因为它指的是跨关系的查询。此处的文档非常清楚(并且确实在接受的答案中被引用):“连续的 filter() 调用进一步限制了对象集”。 【参考方案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)

【讨论】:

以上是关于按可选的开始和结束日期过滤查询集的主要内容,如果未能解决你的问题,请参考以下文章

带有WHERE子句逻辑的SQL Server存储过程

如何在 Prisma 中指定可选的查询过滤器?

使用日期对查询集进行排序

过滤掉基于数据的有效数据和期限数据

Drupal 视图和公开的过滤器 - 如何重置可选的下拉列表过滤器,或允许“全部”选择

在开始和结束日期时间过滤(预订)项目