使用DateTimeField

时间:2016-05-17 20:14:24

标签: django sqlite timezone

我现在正在阅读这本书" Django by Example"。

使用参数查找记录时遇到问题。

我的代码如下所示:

settings.py

TIME_ZONE = 'Asia/Seoul'

models.py

    ...
    published = models.DateTimeField(default=timezone.now)
    ...

views.py

def post_show(request, year, month, day, slug):
    post = get_object_or_404(Post,
                         slug=slug,
                         status='published',
                         published__year=year,
                         published__month=month,
                         published__day=day)

return render(request, 'blog/default/post/show.html', {'post': post})

urls.py

url(r'^(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})/(?P<slug>[-\w]+)/$',
    views.post_show, name='post_show'),

MVT工作正常,但我相信DateTimeField,TimeZone或SQLite3存在问题。

在SQLite3中,&#34;发布&#34; DateTimeField的值为:&#34; 2016-05-17 19:57:03&#34;这是UTC时间。我9小时之前在亚洲/首尔。所以我实际上是在5月18日凌晨4:57发布的。

>>> p = get_object_or_404(Post,slug='test', published__year=2016, published__month=5, published__day=18)
>>> p.title
'test'
>>> p.published
datetime.datetime(2016, 5, 17, 19, 57, 3, tzinfo=<UTC>)

DB说它已于17日发布,但我必须传递参数&#34; 18&#34;。如果我通过17,那就是404。

如何强制过滤条件使用UTC时区?

1 个答案:

答案 0 :(得分:1)

我自己回答我的帖子。我阅读了手册,上面写着。

  

当USE_TZ为True时,日期时间字段将在过滤前转换为当前时区。

我更改了get_absolute_url()方法,将UTC转换为亚洲/首尔时区:

def get_absolute_url(self):

    # this line was added.
    published_localtime = timezone.localtime(self.published)

    return reverse('blog:post_show',
                   args=[
                       published_localtime.year,
                       published_localtime.strftime('%m'),
                       published_localtime.strftime('%d'),
                       self.slug

我这样修好了,但如果有的话,我想知道更好的方法。谢谢。