Django似乎正在缓存日期时间。现在()

2024-10-04 03:17:06 发布

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

我有一个模型是这样的:

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

一个经理看起来像这样:

^{pr2}$

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

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()?在


Tags: django模型服务器视图管理器datetimedateobjects
3条回答

不要使用queryset类变量,而是重写get_queryset。总的来说,我认为queryset有点像是在说青鱼。如果只指定model,Django会自动将queryset设置为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()

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

编辑:

第二,使用get_queryset方法:

class ItemArchive(ArchiveIndexView):
    date_field = 'publish_date'

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

我相信这是由于您的视图将queryset = Item.objects.published()定义为类变量所致。当您的ItemArchive类最初被导入时,这一行将被执行一次。您应该将该行移到每次调用视图时执行的方法中。在

相关问题 更多 >