如何解决Django:按时区筛选月份从SQLite切换到PostgreSQL后
在准备部署时,我从sqlite切换到Postgresql(在this advice之后)。现在,我遇到了一些麻烦,它们无法按月过滤按月的时间戳,这是sqlite以前没有的。问题是,我得到的是上一个月份的项目,而不是当前月份的项目。看,这基本上就是我的代码:
models.py
class Dummy(models.Model):
…
timestamp = models.DateTimeField()
…
views.py
…
current = datetime.date.today().replace(day=1)
dummies = Dummy.objects.values(month=TruncMonth('timestamp')).
filter(month__year=current.year).
filter(month__month=current.month)
…
我实际上在当月有几个虚拟条目(10
),但是dummies
仍然为空。如果将current.month
替换为9
,则会得到确切的这些条目。就像我之前说过的,Postgresql只有这种情况。只要我使用sqlite,一切都OK。
经过研究后,我明白了问题的根源:这些不同类型的数据库处理时区的方式似乎有所不同,例如this answer。
虚拟条目的时间戳记以UTC形式存储在数据库本身中。如果我查看dummies
的一项(如上所述,我通过9
获得),则它具有这样的月份值:
datetime.datetime(2020,10,1,tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>)
current
的值为datetime.date(2020,1)
,没有任何时区信息。因此,我假设使用Postgresql的dummies
的月份值某种程度上已转换为UTC,而日期更改确实有点像2020、9、30。
我尝试了很多,但是我想即使必须很容易,我仍然不知道如何解决这个问题。任何帮助表示赞赏。
解决方法
我走在正确的轨道上,自己找到了问题的答案。这段代码有效:
views.py
from django.utils import timezone
…
current = timezone.now().replace(day=1,hour=0,minute=0,second=0,microsecond=0)
dummies = Dummy.objects.values(month=TruncMonth('timestamp')).
filter(month=current)
现在current
不再是date
,而是datetime
(包括时区),因此非常适合作为过滤器的month
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。