0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DjangoのQuerySetでpythonのnowは使わないほうがいいのではないだろうか

Last updated at Posted at 2019-05-15

起きたこと

https://qiita.com/odoku/items/e9619ad3642d3bfe0289
この方とほぼ同じことが起きました。

Viewのself.querysetはキャッシュされてしまうため、
timezone.timezone.now() などを使ってもキャッシュされた時点のものになってしまう。

このようなWHERE句が発行されるQuerySetとして、Viewのself.querysetにキャッシュされる

WHERE published_at <= "2019-05-15 05:18:33"

やったこと

発行されるSQLでCURRENT_TIMESTAMPが使われるようにする。
https://docs.djangoproject.com/en/2.2/ref/models/database-functions/#now

from django.db.models.functions import Now
class HogeHogeQuerySet(models.QuerySet):
    def published(self):
        return self.filter(published_at__lte = Now())

こうするとこののようなWHERE句が発行される。

WHERE published_at <= CURRENT_TIMESTAMP

なので、キャッシュしても問題がなさそう。

思ったこと

このやり方が良いかどうか確信がないのですが、これが良いのだとしたらQuerySetのメソッド内でdatetime.now()は使わないようにしたほうが良いのではないだろうか。
時間を動的に指定したQuerySetを作りたい場合は必ず引数で渡すようにしたほうがよさそう。

何か変なこと書いてたらご指導お願いします。

おまけ

弊環境では、上記の対応をあんまりスムーズにできていません。
MySQLをDockerの mysql/mysql-server:5.7 で動かしているのですが、
そこの時間を日本時間に設定できていなかったため別の問題が生じてしましました。。
CURRENT_TIMESTAMPが日本時間でないがアプリの時間は日本時間。。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?