Django: наивный datetime в то время как поддержка часовых поясов активна (sqlite)
Я хожу кругами по этому вопросу и нуждаюсь в некоторой помощи. Я продолжаю получать naive timezone
предупреждение. Не знаю, что я делаю не так! Аргумент.
вот предупреждение:
/django/db/models/fields/__init__.py:1222: RuntimeWarning: DateTimeField Video.modified received a naive datetime (2014-10-07 00:00:00) while time zone support is active.
RuntimeWarning)
вот код модели (несколько отредактированный):
from django.db import models
from django.utils import timezone
class ItemBase(models.Model):
created = models.DateTimeField(editable=False)
modified = models.DateTimeField(editable=False)
class Meta:
abstract = True
def save(self, *args, **kwargs):
"""Updates timestamps on save"""
if not self.id:
self.created = timezone.now()
self.modified = timezone.now()
return super(ItemBase, self).save(*args, **kwargs)
class Video(ItemBase):
pass
и соответствующая (я думаю) часть моего файла настроек:
TIME_ZONE = 'UTC'
USE_TZ = True
это проблема sqlite (я все еще тестирую вещи)? Или я упускаю что-то фундаментальное? Я читал об этом. здесь и здесь и, конечно же, в docs здесь. Но я в тупике. Спасибо.
edit: добавлен тест, который выдает ошибку
получаю ошибку, когда я запускаю свои тесты ... Я оставил отредактированный материал там, но вы должны понять идею:
from django.test import TestCase
from django.contrib.auth import get_user_model
from video.models import Video, VideoAccount
class VideoTestCase(TestCase):
def setUp(self):
user = get_user_model().objects.create_user(
username='jacob', email='jacob@test.com', password='top_secret')
self.video_account = VideoAccount.objects.create(
account_type=1, account_id=12345, display_name="Test Account" )
self.pk1 = Video.objects.create(video_type=1, video_id="Q7X3fyId2U0",
video_account=self.video_account, owner=user)
def test_video_creation(self):
"""Creates a video object"""
self.assertEqual(self.pk1.video_id, "Q7X3fyId2U0")
self.assertEqual(self.pk1.video_link, "https://www.youtube.com/watch?v=Q7X3fyId2U0")
3 ответов
поэтому я, наконец, понял это, и я ценю вклад каждого, который заставил меня думать правильно:
одна из моих прошлых миграций была datetime.date.today()
Как значение по умолчанию (которое является подсказкой, которую дают миграции). Я не думал об этом, потому что в то время у меня даже не было данных в модели, а затем, хотя эта миграция была перенесена снова (далее по дороге), похоже, что тестовая система работает каждый раз, когда она запускается. Итак: это предупреждение.
Update: это должно быть исправлена в 1.7.1.
вы используете базу данных SQLite, а база данных SQlite не поддерживает часовые пояса. Это вызывает предупреждение.
это предупреждение можно удалить, используя другой сервер БД.
Если вы хотите получить с sqlite, вероятно, положить эти строки в файл настроек может помочь:
import warnings
import exceptions
warnings.filterwarnings("ignore", category=exceptions.RuntimeWarning, module='django.db.backends.sqlite3.base', lineno=53)
вы установили http://pytz.sourceforge.net/ ?
Как только вы активируете поддержку часового пояса, Django нуждается в определении часового пояса по умолчанию. Когда pytz доступен, Django загружает это определение из базы данных tz. Это наиболее точное решение. В противном случае для вычисления конверсий используется разница между локальным временем и UTC, как сообщает операционная система. Это менее надежно, особенно вокруг DST переходы.