Как я могу отфильтровать дату DateTimeField в Django? - PullRequest
154 голосов
/ 23 августа 2009

Я пытаюсь отфильтровать DateTimeField по сравнению с датой. Я имею в виду:

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

Я получаю пустой список наборов запросов в качестве ответа, потому что (я думаю) я не считаю время, но хочу "в любое время".

Есть ли в Джанго простой способ сделать это?

У меня установлено время в дате, оно не 00:00.

Ответы [ 14 ]

0 голосов
/ 19 апреля 2016

В Django 1.7.6 работает:

MyObject.objects.filter(datetime_attr__startswith=datetime.date(2009,8,22))
0 голосов
/ 19 октября 2015

Вот фантастический пост в блоге, который освещает это здесь: Сравнение даты и времени в Django ORM

Лучшее решение для Django> 1.7, <1.9 - зарегистрировать преобразование: </p>

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)

EDIT

Это решение определенно зависит от сервера. Из статьи:

Конечно, эта реализация зависит от вашего специфического вида SQL, имеющего функцию DATE (). MySQL делает. Как и SQLite. С другой стороны, я лично не работал с PostgreSQL, но некоторые поиски в Google заставляют меня поверить, что у него нет функции DATE (). Поэтому такая простая реализация кажется, что она обязательно будет зависеть от серверной части.

0 голосов
/ 13 сентября 2009
Model.objects.filter(datetime__year=2011, datetime__month=2, datetime__day=30)
0 голосов
/ 23 августа 2009

См. Статью Документация Django

Очень похоже на ответ JZ

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