Django: Наивное datetime, в то время как поддержка часового пояса активна (sqlite)

Я собираюсь в кругах по этому вопросу и нуждаюсь в некоторой помощи. Я продолжаю получать предупреждение naive timezone. Не уверен, что я делаю неправильно! Arg.

Вот предупреждение:

/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 (я все еще проверяю вещи)? Или я пропустил что-то принципиальное здесь? Я прочитал здесь здесь и здесь и, конечно же, в документах здесь. Но я в тупике. Спасибо.

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='[email protected]', 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")

Ответ 1

Итак, я, наконец, понял это, и я ценю каждый вклад, который заставил меня думать правильно:

Одна из моих прошлых миграций имела datetime.date.today() как значение по умолчанию (это подсказка, которую дают миграции). Я не думал об этом, потому что в то время у меня даже не было никаких данных в модели, и тогда, хотя эта миграция была снова перенесена (далее по дороге), кажется, что тестовая система запускает каждую миграцию каждый раз, когда он начинается. Итак: получил это предупреждение.

Обновление: это должно быть исправлено в 1.7.1.

Ответ 2

Вы используете базу данных SQLite, а SQlite db не поддерживает часовые пояса. Это вызывает предупреждение.

Это предупреждение можно удалить, используя другой БД сервера.

Если вы хотите получить sqlite, возможно, поместив эти строки в файл настроек, вы можете помочь:

import warnings
import exceptions
warnings.filterwarnings("ignore", category=exceptions.RuntimeWarning, module='django.db.backends.sqlite3.base', lineno=53)  

Ответ 3

Установили ли вы http://pytz.sourceforge.net/?

Как только вы активируете поддержку часового пояса, Django нуждается в определении часового пояса по умолчанию. Когда pytz доступен, Django загружает это определение из базы данных tz. Это наиболее точное решение. В противном случае он рассчитывает на разницу между местным временем и UTC, как сообщает операционная система, для вычисления конверсий. Это менее надежно, особенно в отношении переходов DST.