2017-02-19 20 views
0

Я удалил все timezone-naive записи из моего Sqlite-DB. Так что теперь они остальные записи имеют DateField вроде этого:Не наивный часовой пояс при запросе django

2016-09-04 13: 28: 16 + 00

Когда я теперь запустить свой запрос так:

result = Feedentry.objects.filter(date_published__gt=timezone('Europe/Berlin').localize(datetime(2016, 8, 31, 17))) 

Сначала я получаю нет ошибок, но как только я хочу, чтобы получить доступ к результату (или Len (результат)) Я получаю следующее сообщение об ошибке:

raise ValueError('Not naive datetime (tzinfo is already set)') 

Любые идеи, как решить эту проблему или то, что я сделал не так?

ответ

1

Django всегда хранит данные в UTC. И в SQLite это doesn't store any timezone information at all:

[Databases other than PostgreSQL] store datetimes without time zone information. If you switch from USE_TZ = False to USE_TZ = True , you must convert your data from local time to UTC – which isn’t deterministic if your local time has DST.

Итак, сначала вы должны пройти через вашу базу данных и конвертировать все значения в формате UTC; в противном случае Django не будет правильно интерпретировать значения.

Что касается вашего сравнения, это правильно, если вы используете pytz.timezone и наивный datetime. Но сообщение об ошибке означает, что все, что datetime вы переходите на localize(), уже известно о часовом поясе. Чтобы преобразовать datetime с учетом часового пояса, вам необходимо использовать datetime.astimezone(), как указано в pytz documentation.

+0

Благодарим за быстрый ответ. Правильно ли, если я использую код выше для моего postgresql-DB, но для тестовой среды, мне нужно использовать функцию datetime.asttimezone(), чтобы использовать время в поле времени datetime наивно? Могу ли я попросить вас предоставить мне код, как это должно быть с вашей точки зрения? Спасибо!!! – Kev

+0

@Kev: Чтобы действительно отследить ошибку, вы должны добавить полный ответ на свой вопрос. –

+0

Спасибо, Кевин - мне это очень помогло. Теперь я заменил часовой пояс из столбцов в моей Sqlite-DB и работал как угодно (то же самое для моего Postgresql на моем сервере) – Kev