2014-02-20 4 views
12

Может кто-нибудь объяснить мне, почему следующие фильтры не работают на уровне месяца и дня? Кажется, что фильтрация по годам работает, но не две другие.Проблемы фильтрации поля datetime django по месяцам и дням

>>> clicks.count() 
36 
>>> date = clicks[0].created 
>>> date.month 
2 
>>> date.year 
2014 
>>> date.day 
1 
>>> clicks.filter(created__month=2) 
[] 
>>> clicks.filter(created__month=02) 
[] 
>>> clicks.filter(created__month='02') 
[] 
>>> clicks.filter(created__month='2') 
[] 
>>> clicks.filter(created__month=date.month) 
[] 
>>> clicks.filter(created__day=date.day) 
[] 

Быстрое обновление, чтобы продемонстрировать, что я получаю такое же поведение, прежде чем создавать и дело с QuerySet:

>>> clicks = PreviewClick.objects.filter(created__month = 2) 
>>> clicks.count() 
0 
>>> clicks = PreviewClick.objects.filter(created__month = 02) 
>>> clicks.count() 
0 
>>> clicks = PreviewClick.objects.filter(created__month = '02') 
>>> clicks.count() 
0 
>>> clicks = PreviewClick.objects.filter(created__month = '2') 
>>> clicks.count() 
0 

Вот еще пища для размышлений:

>>> clicks = PreviewClick.objects.all() 
>>> counter = 0 
>>> for click in clicks: 
...  if click.created.month == 2: 
...   counter += 1 
... 
>>> counter 
35 
+0

Как вы создали клики? – Hoopdady

+0

Уверены ли вы, что у вас есть клики с «созданными» от февраля? Я просто пробовал этот фильтр в одной из наших баз данных, и он отлично работал для меня. – user590028

+1

Похоже, вы сделали .objects.all() и назначили его щелчкам, а затем пытались отфильтровать его. Вероятно, вы хотите сделать .objects.filter (....) – Hoopdady

ответ

12

Я видел точно такое же поведение, как вы.

Если вы проверите documentation для 1.6 и месячного запроса. Они добавили следующий абзац:

«Когда USE_TZ имеет значение True, поля datetime преобразуются в текущий часовой пояс перед фильтрацией, для чего требуются определения часовых поясов в базе данных».

Если вы изменили следующую строку в своих настройках на False, вам следует начать получать данные обратно, которые вы ожидаете.

USE_TZ = False 
+0

Hmmm .... интересный. Я попробую это и посмотрю, что произойдет. Наверное, я новичок в работе с часовыми поясами - я пытаюсь правильно фильтровать в соответствии с часовым поясом и т. Д., Хотя я использую только UTC для фактических записей базы данных. Я делаю вычисления часовых поясов в представлениях. Мне не нужен USE_TZ, если я имею дело с этим таким образом? – zorrotmm

+0

Я не занимался часовыми поясами, я боюсь и не нуждаюсь в моем текущем проекте, поэтому для меня в настоящее время достаточно. Я надеюсь, что эта информация предоставила вам то, что вам нужно, чтобы ваш код снова работал. –

2

Ваш синтаксис является неверен. Оно должно быть:

Clicks.objects.filter(created__month=2) 

(вы остановились менеджер «объектов»)

+0

Я думаю, я не указал, что клики - это набор запросов, который я уже получил с помощью .all() или фильтрацией к 2014 году, который, похоже, работает. Функция filter() должна работать одинаково. В любом случае, я обновлю вопрос, чтобы продемонстрировать, что я получаю тот же результат перед созданием набора запросов. – zorrotmm

8

@Simon Wilder прекрасно ответить, почему это не работает, вот как вы можете решить эту проблему без отключения поддержки TZ в Джанго

Джанго документ дать instruction установить определение часового пояса в базе данных:

SQLite: install pytz - преобразования фактически выполняются в Python.

PostgreSQL: нет требований (см. Временные зоны).

Oracle: нет требований (см. Раздел Выбор файла временной зоны).

MySQL: установите pytz и загрузите таблицы часовых поясов с помощью mysql_tzinfo_to_sql.

В моем случае: MySQL и Mac Os, следующая команда решить проблему:

sudo mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -u root mysql 
+0

Это должен быть правильный ответ – Khonix

0

Чтобы обновить ответ здесь, так как я столкнулся данному вопросу, но ни одно из решений не работал. Большинство новых установок mysql предварительно устанавливаются с помощью tz-info, поэтому команда mysql_tzinfo_to_sql не поможет. И установка TZ_INFO в False на самом деле не является решением, поскольку многие из них нуждаются в времени и времени.

Итак, что сработало для меня, было создать объект datetime, поддерживающий tz, и проверить на это.Допустим, вы хотите фильтровать записи на сегодня, вы бы сделали что-то вроде:

from datetime import datetime 
import pytz 

today = datetime.now().replace(tzinfo=pytz.UTC).date() # tz aware datetime object 
todays_records = myModel.objects.filter(created__year=today.year, created__month=today.month,created__day=today.day) 

Надеюсь, это поможет.

Смежные вопросы