복붙노트

[PYTHON] 어떻게 장고 DateTimeField의 날짜를 필터링 할 수 있습니까?

PYTHON

어떻게 장고 DateTimeField의 날짜를 필터링 할 수 있습니까?

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

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

나는 (내가 생각하기에) 나는 시간을 고려하지 않기 때문에 대답으로 빈 queryset 목록을 얻지 만, 나는 "언제든지"를 원한다.

이 일을 장고에서 쉬운 방법이 있습니까?

datetime에 시간이 정해져 있는데, 00:00이 아닙니다.

해결법

  1. ==============================

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

    이러한 조회는 다음과 같이 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와 날짜 비교"를 확인하십시오.

  2. ==============================

    2.

    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 객체를 만들기 때문에 데이터베이스의 시간이 일치하지 않으므로 작동하지 않습니다.

  3. ==============================

    3.다음은 ipython의 timeit 함수로 얻은 결과입니다.

    다음은 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
    

    빠른 것 같습니다.

  4. ==============================

    4.

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

    위의 내용이 제가 사용했던 것입니다. 뿐만 아니라 작동, 그것은 또한 몇 가지 고유의 논리적 인 후원을하고 있습니다.

  5. ==============================

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

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

  6. ==============================

    6.이것은 __year, __month 및 __day를 사용하는 것과 같은 결과를 만들어 내게 효과가있는 것 같습니다.

    이것은 __year, __month 및 __day를 사용하는 것과 같은 결과를 만들어 내게 효과가있는 것 같습니다.

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

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

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

    예 : MyObject.objects.filter (datetime_attr__date = datetime.date (2009,8,22))

  8. ==============================

    8.active_on이 날짜 객체라고 가정하고 1 일 씩 증가시킨 다음 범위를 수행합니다.

    active_on이 날짜 객체라고 가정하고 1 일 씩 증가시킨 다음 범위를 수행합니다.

    next_day = active_on + datetime.timedelta(1)
    queryset = queryset.filter(date_created__range=(active_on, next_day) )
    
  9. ==============================

    9.흥미로운 기술입니다. MySQL의 Django로 구현 된 startswith 프로 시저를 활용하여 날짜만으로 datetime을 찾는 결과를 얻었습니다. 기본적으로 Django는 데이터베이스에서 조회를 수행 할 때 DATETIME MySQL 저장 객체에 대한 문자열 변환을 수행해야하므로이를 필터링하여 날짜의 타임 스탬프 부분을 생략 할 수 있습니다. 그런 식으로 % LIKE %는 날짜 만 일치시킵니다 개체와 주어진 날짜에 대한 모든 타임 스탬프를 얻을거야.

    흥미로운 기술입니다. MySQL의 Django로 구현 된 startswith 프로 시저를 활용하여 날짜만으로 datetime을 찾는 결과를 얻었습니다. 기본적으로 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 |
    +---------------------+
    

    Django가 해결책을 제시 할 때까지 모든 사람들에게 도움이되기를 바랍니다!

  10. ==============================

    10.흠 .. 제 해결책이 효과가 있습니다 :

    흠 .. 제 해결책이 효과가 있습니다 :

    Mymodel.objects.filter(date_time_field__startswith=datetime.datetime(1986, 7, 28))
    
  11. ==============================

    11.장고 1.7.6에서 작동 :

    장고 1.7.6에서 작동 :

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

    12.Django 문서를보기 바란다.

    Django 문서를보기 바란다.

    JZ 답변과 매우 유사합니다.

    ur_data_model.objects.filter(ur_date_field=datetime(2005, 7, 27)
    
  13. ==============================

    13.

    Model.objects.filter(datetime__year=2011, datetime__month=2, datetime__day=30)
    
  14. ==============================

    14.Django ORM에서 날짜와 시간대 비교하기 : 여기에서 다루는 환상적인 blogpost가 있습니다.

    Django ORM에서 날짜와 시간대 비교하기 : 여기에서 다루는 환상적인 blogpost가 있습니다.

    Django> 1.7, <1.9에 게시 된 최상의 솔루션은 변환을 등록하는 것입니다.

    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)
    

    편집하다

    이 솔루션은 분명히 백엔드에 의존합니다. 기사에서 :

  15. from https://stackoverflow.com/questions/1317714/how-can-i-filter-a-date-of-a-datetimefield-in-django by cc-by-sa and MIT license