2016-05-17 4 views
0

Теперь я читаю книгу «Django by Example».Django get_object_or_404() с DateTimeField

У меня проблема при поиске записи с параметрами.

Мои коды, как показано ниже:

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 «опубликовано» DateTimeField имеет значение: «2016-05-17 19:57:03», которое является временем UTC. Я в Азии/Сеуле опережает 9 часов. поэтому я фактически опубликовал его в 4:57 18 мая.

>>> 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-го числа, но мне нужно передать параметр «18». Если я прохожу 17, это будет 404.

Как я могу заставить фильтр использовать UTC часовой пояс?

ответ

0

Я отвечаю на свой пост сам. Я читаю руководство, в котором говорится.

Когда USE_TZ имеет значение True, поля datetime преобразуются в текущий часовой пояс перед фильтрацией.

Я изменил 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 

Я установил это, как это, но я хотел бы знать, лучший способ, если у меня есть , Спасибо.

Смежные вопросы