Django:使用时区筛选月份(从SQLite切换到PostgreSQL后)

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

在准备部署时,我从SQLite切换到PostgreSQL(如下)。现在,我在按月份过滤某些项目的时间戳时遇到了一些问题,这是我以前使用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
),但
虚拟条目仍然为空。如果我用
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
作为过滤器