Django似乎正在缓存datetime.now()

use*_*534 5 python django datetime caching

我有一个看起来像这样的模型:

class Item(models.Model):
    ...
    publish_date = models.DateTimeField(default=datetime.datetime.now)
    ...
Run Code Online (Sandbox Code Playgroud)

还有一个看起来像这样的经理:

from datetime import datetime

class ItemManager(Manager):
    def published(self):
        return self.get_query_set().filter(publish_date__lte=datetime.now()
Run Code Online (Sandbox Code Playgroud)

一个看起来像这样的视图:

class ItemArchive(ArchiveIndexView):
    queryset = Item.objects.published()
    date_field = 'publish_date'
Run Code Online (Sandbox Code Playgroud)

我的想法是,我可以调用Item.objects.published()并获取所有已发布的查询集Items.

问题是Django似乎datetime.now()在服务器启动时在管理器中执行调用,然后缓存该值.因此,如果今天是5月24日,并且我创建了Item一个发布日期为5月23日,并且在5月22日启动了服务器,那么5月23日的项目将不会显示在ItemArchive视图中.一旦我重新启动Apache,5月23日项目就会在视图中正确显示.

datetime.now()每次调用管理器时,如何强制Django执行?

dge*_*gel 12

我相信这是由您定义queryset = Item.objects.published()为类变量的视图引起的.ItemArchive最初导入类时,此行将执行一次.您应该将该行移动到每次调用视图时都将执行的方法.

  • 是.或者,定义一个单独的PublishedManager,它覆盖`get_query_set`.这将是懒惰的,而你的`published`方法则不是. (2认同)