我有一个模型是这样的:
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()
?在
不要使用
queryset
类变量,而是重写get_queryset
。总的来说,我认为queryset
有点像是在说青鱼。如果只指定model
,Django会自动将queryset设置为self.model.objects.all()
。如果需要任何筛选,100次中有99次需要重写get_queryset
以确保线程安全。试试下面的方法。在首先,只需使用
models.DateTimeField(auto_now_add=True)
编辑:
第二,使用
get_queryset
方法:我相信这是由于您的视图将
queryset = Item.objects.published()
定义为类变量所致。当您的ItemArchive
类最初被导入时,这一行将被执行一次。您应该将该行移到每次调用视图时执行的方法中。在相关问题 更多 >
编程相关推荐