Django filter datetime base on date only

℡╲_俬逩灬. 提交于 2019-12-05 15:54:07

问题


I'm trying to filter the query set in the BaseDatatableView on a date that's entered in by the user in the following format: mm/dd/yyyy. So start_date is in that format and will get converted to a datetime with strptime, see below.

I'd like to compare it to exactly a date datetimefield in the db, but i'd like to match the month, day, year exactly, disregarding the time. This is what I have so that doesn't work.

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

Thanks


回答1:


Best Option (Django 1.9+ . - For datetime fields, casts the value as date. Allows chaining additional field lookups. Takes a date value.)

# 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)

Options for Django < 1.9

One option (break the date down in the filter):

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
)

Another option (set the min/max time for the date and use range):

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)


来源:https://stackoverflow.com/questions/22085398/django-filter-datetime-base-on-date-only

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!