Подтвердить что ты не робот

База данных datetime фильтра Django только по дате

Я пытаюсь отфильтровать набор запросов в BaseDatatableView в дате, введенной пользователем в следующем формате: mm/dd/yyyy. Таким образом, start_date находится в этом формате и будет преобразован в datetime с strptime, см. Ниже.

Я бы хотел сравнить его с датой datetimefield в db, но я хотел бы точно сравнить месяц, день, год, не считая времени. Это то, что у меня есть, чтобы он не работал.

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

Спасибо

4b9b3361

Ответ 1

Наилучший вариант (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)

Варианты для Джанго <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)