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

时间:2012-05-24 16:05:56

标签: python django caching datetime

我的模型看起来像这样:

class Item(models.Model):
    ...
    publish_date = models.DateTimeField(default=datetime.datetime.now)
    ...

一位看起来像这样的经理:

from datetime import datetime

class ItemManager(Manager):
    def published(self):
        return self.get_query_set().filter(publish_date__lte=datetime.now()

一个看起来像这样的观点:

class ItemArchive(ArchiveIndexView):
    queryset = Item.objects.published()
    date_field = 'publish_date'

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

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

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

3 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:3)

请勿使用queryset类变量,而是覆盖get_queryset。总的来说,我认为queryset有点像红鲱鱼。如果您只是指定model,Django会自动将查询集设置为self.model.objects.all()。如果您需要任何过滤,100次中有99次,您需要覆盖get_queryset以确保线程安全。请尝试以下方法。

class ItemArchive(ArchiveIndexView):
    model = Item
    date_field = 'publish_date'

    def get_queryset(self):
        return super(ItemArchive, self).get_queryset().published()

答案 2 :(得分:0)

首先,只需使用models.DateTimeField(auto_now_add=True)

<强>编辑:

其次,使用get_queryset方法:

class ItemArchive(ArchiveIndexView):
    date_field = 'publish_date'

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