Django 仅基于日期过滤日期时间

Posted

技术标签:

【中文标题】Django 仅基于日期过滤日期时间【英文标题】:Django filter datetime base on date only 【发布时间】:2014-03-31 21:05:38 【问题描述】:

我正在尝试过滤 BaseDatatableView 中用户以以下格式输入的日期的查询集:mm/dd/yyyy。所以 start_date 就是这种格式,并且会使用 strptime 转换为日期时间,见下文。

我想将它与数据库中的确切日期日期时间字段进行比较,但我想完全匹配月、日、年,而不考虑时间。这就是我所拥有的,所以它不起作用。

class AppointmentListJson(LoginRequiredMixin, BaseDatatableView):
             ....
    start_date = params.get('start_date', '')
    if start_date:  
        qs = qs.filter(start_date__contains=datetime.strptime(
            start_date, DATE_FORMAT))

    return qs

谢谢

【问题讨论】:

【参考方案1】:

最佳选择(Django 1.9+ . - For datetime fields, casts the value as date。允许链接其他字段查找。采用日期值。)

# Assumes the start_date variable is a datetime.date() instance or
# a value such as '2019-07-11'.
qs.filter(start_date__date=start_date)

# Note that you can also "chain" this result
qs.filter(start_date__date__lte=start_date)

Django

一个选项(在过滤器中分解日期):

start_date = datetime.strptime(start_date, DATE_FORMAT)
qs = qs.filter(
    start_date__year=start_date.year,
    start_date__month=start_date.month,
    start_date__day=start_date.day
)

另一个选项(设置日期和使用范围的最小/最大时间):

from datetime import datetime
start_date = datetime.strptime(start_date, DATE_FORMAT)
start_date_range = (
    # The start_date with the minimum possible time
    datetime.combine(start_date, datetime.min.time()),
    # The start_date with the maximum possible time
    datetime.combine(start_date, datetime.max.time())
)
qs = qs.filter(start_date__range=start_date_range)

【讨论】:

@JoeLones 太棒了!你介意accepting my answer吗?

以上是关于Django 仅基于日期过滤日期时间的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 django F 表达式仅过滤日期时间字段的日期

Django 按时间过滤日期时间字段,与日期无关

Django:按日期过滤日期时间忽略时间

django个人过滤器日期时间

如何在 django 中按日期范围过滤记录?

如何使用时区感知日期过滤模型?