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