Django:使用时区筛选月份(从SQLite切换到PostgreSQL后)
在准备部署时,我从SQLite切换到PostgreSQL(如下)。现在,我在按月份过滤某些项目的时间戳时遇到了一些问题,这是我以前使用SQLite时没有遇到的。问题是,我得到的是上个月的项目,而不是当前的项目。看,这就是我的代码基本上的样子:Django:使用时区筛选月份(从SQLite切换到PostgreSQL后),django,postgresql,sqlite,django-timezone,Django,Postgresql,Sqlite,Django Timezone,在准备部署时,我从SQLite切换到PostgreSQL(如下)。现在,我在按月份过滤某些项目的时间戳时遇到了一些问题,这是我以前使用SQLite时没有遇到的。问题是,我得到的是上个月的项目,而不是当前的项目。看,这就是我的代码基本上的样子: models.py class Dummy(models.Model): … timestamp = models.DateTimeField() … views.py … curr
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
),但虚拟条目仍然为空。如果我用9
替换current.month
,我会得到准确的这些条目。正如我之前所说,PostgreSQL的情况就是这样。只要我使用SQLite,一切都很好
经过一些研究,我明白了问题的根源:这些不同类型的数据库处理时区的方式似乎有所不同,例如
虚拟条目的时间戳作为UTC存储在数据库本身中。如果我看一个假人
(我用上面提到的9
得到),它的月份值如下:
datetime.datetime(2020, 10, 1, 0, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CEST+2:00:00 DST>)
datetime.datetime(2020,10,1,0,0,tzinfo=)
current
的值是datetime.date(2020,10,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)
现在,当前的
不再是日期
,而是日期时间
,包括一个时区,因此非常适合月份
作为过滤器。我走对了路,自己找到了问题的答案。此代码适用于:
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
作为过滤器