Django:时区支持处于活动状态时的天真日期时间(sqlite)

时间:2014-10-08 20:02:17

标签: python django sqlite datetime timezone

我在这个圈子里四处走动,需要一些帮助。我继续收到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问题(我还在测试东西)吗?或者我错过了一些基本的东西?我已经阅读了herehere,当然还有文档here。但我很难过。感谢。

编辑:添加了抛出错误的测试

我在运行测试时遇到错误...我将编辑后的内容留在那里,但你应该明白这个想法:

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 个答案:

答案 0 :(得分:7)

所以我终于明白了,我感谢所有人的投入让我以正确的方式思考:

我过去的一次迁移有datetime.date.today()作为默认值(这是迁移提供的提示)。我没有想到它,因为当时我甚至没有在模型中有任何数据,然后,即使迁移已经再次迁移(进一步发展),看来测试系统正在运行每次迁移每次开始。所以:得到了警告。

更新:这应该是fixed in 1.7.1

答案 1 :(得分:2)

您正在使用SQLite数据库,而SQlite数据库不支持时区。这导致了警告。

可以使用其他数据库后端删除此警告。

如果您想使用sqlite,可能需要将这些行放在设置文件中:

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

答案 2 :(得分:0)

您安装了http://pytz.sourceforge.net/吗?

  

一旦激活时区支持,Django就需要定义默认时区。当pytz可用时,Django从tz数据库加载此定义。这是最准确的解决方案。否则,它依赖于操作系统报告的本地时间和UTC之间的差异来计算转换。这不太可靠,特别是在DST过渡期间。