Я пытаюсь отфильтровать DateTimeField
сравнение с датой. Я имею в виду:
MyObject.objects.filter(datetime_attr=datetime.date(2009,8,22))
Я получаю пустой список наборов запросов в качестве ответа, потому что (я думаю) я не рассматриваю время, но хочу "в любое время".
Есть ли в Django простой способ сделать это?
У меня установлено время в datetime, это не так 00:00
.
Ответы:
Такие поиски реализованы
django.views.generic.date_based
следующим образом:Поскольку это довольно многословно, есть планы улучшить синтаксис с использованием
__date
оператора. Проверьте " # 9596 Сравнение DateTimeField с датой слишком сложно " для более подробной информации.источник
Q(created__gte=datetime.combine(created_value, time.min))
Entry.objects.filter(pub_date__date=datetime.date(2005, 1, 1))
// редактировать после комментариев
Doest не работает, потому что он создает объект datetime со значениями времени, установленными в 0, поэтому время в базе данных не совпадает.
источник
Вот результаты, которые я получил с помощью функции timeit ipython:
Содержится, кажется, быстрее.
источник
contains
решение, я получаю сообщение об ошибке:Unable to get repr for <class 'django.db.models.query.QuerySet'>
__contains
фильтром. Но если вы работаете с проблемами , вы должны попробовать пример Джанго DOCS , который использует__gte
.startswith
решение ..Теперь у Django есть фильтр наборов запросов __date для запроса объектов datetime к датам в версии разработки. Таким образом, он будет доступен в 1.9 в ближайшее время.
источник
выше то, что я использовал. Он не только работает, но и имеет некоторую внутреннюю логическую поддержку.
источник
Начиная с Django 1.9, способ сделать это - использовать
__date
объект datetime.Например:
MyObject.objects.filter(datetime_attr__date=datetime.date(2009,8,22))
источник
Это дает те же результаты, что и при использовании __year, __month и __day, и, похоже, работает для меня:
источник
предполагая, что active_on является объектом даты, увеличьте его на 1 день, затем сделайте диапазон
источник
Вот интересная техника - я использовал процедуру стартов с помощью Django на MySQL, чтобы добиться результата только поиска даты и времени только по дате. По сути, когда Django выполняет поиск в базе данных, он должен выполнить преобразование строк для объекта хранения DATETIME MySQL, так что вы можете отфильтровать его, оставив часть даты с отметкой времени - таким образом,% LIKE% соответствует только дате объект, и вы получите каждую отметку времени на указанную дату.
Это выполнит следующий запрос:
LIKE BINARY в этом случае будет соответствовать всему для даты, независимо от отметки времени. Включая такие значения, как:
Надеюсь, это поможет всем, пока Джанго не выйдет с решением!
источник
Вот фантастический пост, который освещает это здесь: сравнение дат и времени в Django ORM
Лучшее решение для Django> 1.7, <1.9 - зарегистрировать преобразование:
Затем вы можете использовать его в своих фильтрах следующим образом:
РЕДАКТИРОВАТЬ
Это решение определенно зависит от сервера. Из статьи:
источник
return '{}::date'.format(lhs), params
Хм .. Мое решение работает:
источник
источник
В Django 1.7.6 работает:
источник
__lte
например.Смотрите статью Django Документация
источник