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 仅基于日期过滤日期时间的主要内容,如果未能解决你的问题,请参考以下文章