Django基于日期筛选时间日期

16
我正在尝试在BaseDatatableView中过滤查询集,以用户输入的日期格式mm/dd/yyyy为基础。因此,start_date以该格式存储,并将通过strptime转换为datetime,详见下文。
我想将其与数据库中的datetimefield精确比较,但我希望完全匹配月份、日期和年份,不考虑时间。这就是我的代码,但它无法工作。
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个回答

51

最佳选项(Django 1.9+ - 对于日期时间字段,将值转换为日期。允许链接其他字段查找。接受一个日期值。)

# 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 1.9以下版本的选项

一种选项(在筛选器中分解日期):

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)

3
@JoeLones 太好了!您介意接受我的回答吗? - Michael B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接