微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Django:按时区筛选月份从SQLite切换到PostgreSQL后

如何解决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),没有任何时区信息。因此,我假设使用Postgresqldummies的月份值某种程度上已转换为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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?