Django Queryset过滤与时区。现在返回意外结果

2024-06-16 11:34:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个模型,它的“published”实例我希望是带有一个publish_date的已经过去的实例。在

# settings.py

USE_TZ = True

TIME_ZONE = 'Europe/Athens'


# models.py

class Publishable(models.Model):
    date_published = models.DateTimeField(
        _('publish date'), blank=True, null=True)

    objects = PublishableManager()


# managers.py

class PublishableQuerySet(models.QuerySet):
    def published(self):
        now = timezone.now()
        return self.exclude(
            Q(date_published__gt=now) | Q(date_published__isnull=True))


class PublishableManager(models.Manager):
    def get_queryset(self):
        return PublishableQuerySet(
            self.model, using=self.db).prefetch_related()

    def published(self):
        return self.get_queryset().published()

所以我在数据库中有一个Publishable实例,它的date_published是过去的,当我试图获取“published”实例时应该获取它。然而,即使在实际比较它的date_published和{}时,它被正确地称为过去。例如:

^{pr2}$

一些额外的信息:

  • date_published大约50分钟或更长时间之前,将获取实例
  • 当我删除.pyc文件时,会获取实例
  • {cd8.8>安装了djangi

那么,如果通过了与当前时间的比较测试,为什么不获取实例呢?我错过了什么?在


编辑

以上是在一个开发环境中(使用SQLite和django的dev服务器),但是“缺少发布的实例”也在生产环境中被发现(不幸的是,MySQL)。在

我上面提到的.pyc现象有点不正确。当我重新启动dev server时,该行为将得到纠正。在

我注意到的一件事,显然与此相关,那就是如果我试图在PublishableQuerySet.published()print,那么大多数时候它都不会被调用(即没有print发生),所以基本上。。。与timezone.now()的比较似乎没有发生。在


Tags: 实例pyselftruedatereturnmodelsdef