在用MySQL做数据库,且django设置USE_TZ=True时,会遇到一个问题,就是按月份或日期筛选model数据时只能得到空集,如下。这个问题最粗暴的解决办法是设置USE_TZ=False,但这样做也就无法使用django的时区功能了。
>>> Article.objects.filter(pub_date__month=2)
SELECT `blog_article`.`id`, `blog_article`.`title`, `blog_article`.`cover`, `blog_article`.`content`, `blog_article`.`pub_date`, `blog_article`.`author_id`, `blog_article`.`category_id`, `blog_article`.`views` FROM `blog_article` WHERE EXTRACT(MONTH FROM CONVERT_TZ(`blog_article`.`pub_date`, 'UTC', 'Asia/Shanghai')) = 2 ORDER BY `blog_article`.`pub_date` DESC LIMIT 21; args=(2,)
而从根源上解决这个问题要涉及到MySQL的配置,django官方文档中给出了解决方案。MySQL使用时区查询,需要先用mysql_tzinfo_to_sql载入时区表。不过这个办法在windows下好像行不通。
最好的解决办法其实是换