与timezone.now相比,Django Queryset过滤返回意外结果

时间:2016-04-01 14:19:28

标签: python django datetime pytz

我有一个模型,其发表的#34;我希望成为过去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已经过去了,当我尝试获取"已发布的"时,应该获取该实例。实例。但是,即使在实际比较date_publishedtimezone.now()时,也未提取它,但正确地说它是过去的。例如:

from django.utils import timezone as t

p = Publishable.objects.latest('date_published')
p.date_published == datetime.datetime(2016, 4, 1, 14, 5, tzinfo=<UTC>) # -> True 
t.now() == datetime.datetime(2016, 4, 1, 14, 6, 6, 481400, tzinfo=<UTC>) # -> True 
t.now() > p.date_published()  # -> True, which is expected

p in Publishable.objects.published()  # -> False... why?

一些额外信息:

  • date_published大约50分钟或更长时间之前,将获取实例
  • 当我删除.pyc文件时,将获取实例
  • 我正在使用Django 1.8.11并且安装了pytz

那么,如果通过与当前时间的比较测试,为什么不提取实例呢?我在这里缺少什么?

修改

以上是在开发环境中(使用SQLite和django的开发服务器),但是&#34;缺少已发布的实例&#34;已经在生产环境中见证过(不幸的是MySQL)。

我上面提到的.pyc现象有点不正确。当我重新启动开发服务器时,行为会得到纠正。

我注意到的与此明显相关的是,如果我在print中尝试PublishableQuerySet.published(),则不会调用它(即不会发生print )大部分时间,基本上......与timezone.now()的比较似乎没有发生。

0 个答案:

没有答案