DateTimeField 날짜를 Django에서 필터링하려면 어떻게 해야 합니까?
을 하려고 .DateTimeField
내 말은...
MyObject.objects.filter(datetime_attr=datetime.date(2009,8,22))
시간을 고려하지 않고 "언제든지" 하고 싶기 때문에 빈 쿼리셋 목록이 답변으로 표시됩니다.
장고에서 쉽게 할 수 있는 방법이 있을까요?
, .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))
doest는 시간 값이 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에는 개발 버전의 날짜에 대해 날짜/시간 개체를 쿼리하는 __date 쿼리셋 필터가 있습니다.따라서 곧 1.9로 출시될 예정입니다.
Mymodel.objects.filter(date_time_field__contains=datetime.date(1986, 7, 28))
위는 제가 사용한 것입니다.동작할 뿐만 아니라, 고유의 논리적인 뒷받침도 있습니다.
Django 1.9에서는 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))
active_on이 날짜 객체라고 가정하고 1일 증가시킨 후 범위를 수행합니다.
next_day = active_on + datetime.timedelta(1)
queryset = queryset.filter(date_created__range=(active_on, next_day) )
이렇게 하면 돼
MyObject.objects.filter(datetime_field__date=datetime.date(2009,8,22))
또는 두 날짜 사이에서 필터링을 원하는 경우
MyObject.objects.filter(
datetime_field__date__range=(datetime.date(2009,8,22), datetime.date(2009,9,22))
)
날짜 형식이 django 날짜 형식과 같으므로 날짜별로 필터링할 수 있습니다.기본 포맷은 ISO YYY-MM-DD 입니다.
target_date = "2009-08-22"
qs = MyObject.objects.filter(datetime_attr__date=target_date)
여기에 이 내용을 다루는 멋진 블로그 포스트가 있습니다: Dango ORM의 날짜와 날짜 비교
The best solution posted for Django>1.7,<1.9 is to register a transform:
from django.db import models
class MySQLDatetimeDate(models.Transform):
"""
This implements a custom SQL lookup when using `__date` with datetimes.
To enable filtering on datetimes that fall on a given date, import
this transform and register it with the DateTimeField.
"""
lookup_name = 'date'
def as_sql(self, compiler, connection):
lhs, params = compiler.compile(self.lhs)
return 'DATE({})'.format(lhs), params
@property
def output_field(self):
return models.DateField()
그런 다음 필터에서 다음과 같이 사용할 수 있습니다.
Foo.objects.filter(created_on__date=date)
편집
이 솔루션은 확실히 백엔드에 의존합니다.기사 내용:
물론 이 구현은 DATE() 함수를 가진 특정 SQL 플레이버에 의존합니다.MySQL은 그렇습니다.SQLite도 마찬가지입니다.한편, 저는 Postgre와 함께 일하지 않았습니다.SQL을 개인적으로 사용하지만 일부 구글링에서는 DATE() 함수가 없는 것으로 생각됩니다.따라서 이렇게 간단한 구현은 반드시 백엔드에 의존해야 할 것으로 보입니다.
여기 흥미로운 기술이 있습니다. MySQL의 Django에서 구현된 startswith procedure를 활용하여 날짜만 조회하는 결과를 얻었습니다.기본적으로 Django는 데이터베이스에서 검색을 수행할 때 DATETIME MySQL 스토리지 개체의 문자열을 변환해야 합니다. 따라서 날짜의 타임스탬프 부분을 제외하고 필터링할 수 있습니다. 그러면 %LIKE%가 날짜 개체에만 일치하며 지정된 날짜에 대한 모든 타임스탬프를 얻을 수 있습니다.
datetime_filter = datetime(2009, 8, 22)
MyObject.objects.filter(datetime_attr__startswith=datetime_filter.date())
그러면 다음 조회가 수행됩니다.
SELECT (values) FROM myapp_my_object \
WHERE myapp_my_object.datetime_attr LIKE BINARY 2009-08-22%
이 경우 LIKE BINARY는 타임스탬프에 관계없이 날짜의 모든 것과 일치합니다.다음과 같은 값 포함:
+---------------------+
| datetime_attr |
+---------------------+
| 2009-08-22 11:05:08 |
+---------------------+
장고가 해결책을 내놓을 때까지 이것이 모두에게 도움이 되기를 바랍니다!
MyObject.objects.filter(datetime_attr__date=datetime.date(2009,8,22))
문서 "장고 문서"를 참조하십시오.
ur_data_model.objects.filter(ur_date_field__gte=datetime(2009, 8, 22), ur_date_field__lt=datetime(2009, 8, 23))
음.. 내 솔루션은 작동 중입니다.
Mymodel.objects.filter(date_time_field__startswith=datetime.datetime(1986, 7, 28))
Model.objects.filter(datetime__year=2011, datetime__month=2, datetime__day=30)
장고 1.7.6 작품:
MyObject.objects.filter(datetime_attr__startswith=datetime.date(2009,8,22))
person = Profile.objects.get(id=1)
tasks = Task.objects.filter(assigned_to=person, time_stamp__year=person.time_stamp.utcnow().year)
모든 모델에는 time_stamp가 있기 때문에 현재 연도를 취득하기 위해 person 객체를 사용했습니다.
일부 날짜 범위 사이에서 필터링할 수 있습니다.
2016-01-01 00:00:00 <--> 2016-04-01 23:59:59.99999
User.objects.filter(date_joined__gte=datetime.combine(datetime.strptime('2016-
01-01', '%Y-%d-%m'), datetime.min.time()),
date_joined__lte=datetime.combine(datetime.strptime('2016-04-01', '%Y-%d-%m'),
datetime.max.time())).count()
2016-01-01 00:00:00 <--> 2016-01-14 00:00:00
User.objects.filter(date_joined__gte='2016-01-01', date_joined__lte='2016-1-14').count()
마찬가지로 datetime 필드가 있는 경우 datetime.date.today()를 사용할 수 있습니다.
context['now'] = Mymodel.objects.filter(date_time_field=datetime.date.today())
언급URL : https://stackoverflow.com/questions/1317714/how-can-i-filter-a-date-of-a-datetimefield-in-django
'programing' 카테고리의 다른 글
유형을 지정하지 않고 Java Enum을 참조하려면 어떻게 해야 합니까? (0) | 2022.09.21 |
---|---|
Gulp 태스크를 순차적으로 실행하는 방법 (0) | 2022.09.21 |
어떻게 장고의 테스트 데이터베이스를 메모리에서만 실행할 수 있습니까? (0) | 2022.09.21 |
는 URL은 주어진 문자열이 포함되 어떻게 확인해야 하죠? (0) | 2022.09.21 |
Python에서 현재 모듈 내의 모든 클래스 목록을 얻으려면 어떻게 해야 합니까? (0) | 2022.09.21 |