Фильтрация django DatetimeField__date не работает

Согласно этому документу, добавленному в версии 1.9, мы может запросить DateTimeField по дате без времени.

Примеры:

Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
Entry.objects.filter(pub_date__date__gt=datetime.date(2005, 1, 1))

Но это не работает для меня:

class MilkStorage(models.Model):
    ....

    created_at = models.DateTimeField(null=False)

Использование

from datetime import date
MilkStorage.objects.filter(created_at__date=date.today())

Он возвращает пустой набор запросов <QuerySet []>.

Этот запрос работает только на PostgreSQL? я использую MySQL.


person Roel    schedule 09.03.2017    source источник
comment
Вы правы, это не работает ни в моем приложении, ни в предложении @mohammed-shareef-c.   -  person albar    schedule 09.03.2017
comment
да, я думаю, мне нужно поднять вопрос об этом на github   -  person Roel    schedule 09.03.2017
comment
Извините, я не правильно провел тест. Это работает в моем случае. Возможно, вы не создали ни одного MilkStorage сегодня. Это моя ошибка.   -  person albar    schedule 09.03.2017
comment
это действительно работает для меня, и я создал MilkStorage с сегодняшней датой.   -  person Roel    schedule 10.03.2017


Ответы (2)


В зависимости от ваших конкретных требований, это может быть или не быть идеальным решением. Я обнаружил, что __date работает, если вы установите USE_TZ = False в settings.py

У меня была такая же проблема (я даже не мог фильтровать по __month или __day), пока не отключил USE_TZ. Опять же, может быть не идеальным для вашего случая, но он должен снова заставить __date работать.

person J. Morris    schedule 14.06.2017
comment
подтвердите, что это так для меня, если у вас USE_TZ = true, то фильтр __date не работает. - person Par; 20.02.2019
comment
Я также подтверждаю это, но есть ли другая альтернатива? - person Hafiz Siddiq; 15.06.2021

У меня есть модель посетителя. В этой модели я отфильтровал данные по дате, а не по времени, и это работает.

модели.py

Visitor(models.Model):
    timestamp = models.DateTimeField(_('Login Date Time'), auto_now=True)
    os_info = models.CharField(_('OS Information'), max_length=30, null=True)

просмотры.py

import datetime      
visitor = Visitor.objects.filter( timestamp__lte=datetime.datetime.now().date())
print visitor 

Выход:

<Visitor: Windows 10>, <Visitor: Windows 10>]

Используйте вышеуказанный способ для фильтрации данных по дате.

person Neeraj Kumar    schedule 09.03.2017
comment
но можно ли отфильтровать без __lte? - person Roel; 10.03.2017
comment
Без __lte вы должны добавить __date для точного совпадения. - person albar; 10.03.2017