起きたこと
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が日本時間でないがアプリの時間は日本時間。。