[python] Django에서 DateTimeField의 날짜를 어떻게 필터링합니까?

DateTimeField날짜와 비교 를 필터링하려고 합니다. 내말은:

MyObject.objects.filter(datetime_attr=datetime.date(2009,8,22))

나는 시간을 고려하지 않고 “언제나”를 원하기 때문에 빈 쿼리 세트 목록을 대답으로 얻습니다.

Django 에서이 작업을 수행하는 쉬운 방법이 있습니까?

날짜 시간에 시간이 설정되어 00:00있습니다.



답변

이러한 조회는 django.views.generic.date_based다음과 같이 구현 됩니다.

{'date_time_field__range': (datetime.datetime.combine(date, datetime.time.min),
                            datetime.datetime.combine(date, datetime.time.max))} 

매우 장황하기 때문에 __date연산자를 사용하여 구문을 향상시킬 계획이 있습니다 . 자세한 내용은 ” # 9596 DateTimeField와 날짜를 비교하는 것이 너무 어렵다 “를 확인하십시오.


답변

YourModel.objects.filter(datetime_published__year='2008',
                         datetime_published__month='03',
                         datetime_published__day='27')

// 주석 후 편집

YourModel.objects.filter(datetime_published=datetime(2008, 03, 27))

시간 값이 0으로 설정된 datetime 객체를 생성하므로 데이터베이스의 시간이 일치하지 않으므로 작동하지 않습니다.


답변

ipython의 timeit 함수로 얻은 결과는 다음과 같습니다.

from datetime import date
today = date.today()

timeit[Model.objects.filter(date_created__year=today.year, date_created__month=today.month, date_created__day=today.day)]
1000 loops, best of 3: 652 us per loop

timeit[Model.objects.filter(date_created__gte=today)]
1000 loops, best of 3: 631 us per loop

timeit[Model.objects.filter(date_created__startswith=today)]
1000 loops, best of 3: 541 us per loop

timeit[Model.objects.filter(date_created__contains=today)]
1000 loops, best of 3: 536 us per loop

포함 이 더 빠른 것 같습니다.


답변

이제 Django에는 개발 버전의 날짜에 대해 datetime 객체를 쿼리하는 __date queryset 필터가 있습니다. 따라서 곧 1.9에서 사용할 수 있습니다.


답변

Mymodel.objects.filter(date_time_field__contains=datetime.date(1986, 7, 28))

위는 내가 사용한 것입니다. 작동 할뿐만 아니라 고유 한 논리적 백업도 있습니다.


답변

Django 1.9 __date부터는 datetime 객체를 사용하는 방법이 있습니다.

예를 들면 다음과 같습니다.
MyObject.objects.filter(datetime_attr__date=datetime.date(2009,8,22))


답변

이것은 __year, __month 및 __day를 사용하는 것과 동일한 결과를 생성하며 저에게 효과적입니다.

YourModel.objects.filter(your_datetime_field__startswith=datetime.date(2009,8,22))