我有一个模型,其发表的#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_published
与timezone.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
文件时,将获取实例pytz
那么,如果通过与当前时间的比较测试,为什么不提取实例呢?我在这里缺少什么?
修改
以上是在开发环境中(使用SQLite
和django的开发服务器),但是&#34;缺少已发布的实例&#34;已经在生产环境中见证过(不幸的是MySQL
)。
我上面提到的.pyc
现象有点不正确。当我重新启动开发服务器时,行为会得到纠正。
我注意到的与此明显相关的是,如果我在print
中尝试PublishableQuerySet.published()
,则不会调用它(即不会发生print
)大部分时间,基本上......与timezone.now()
的比较似乎没有发生。