我的模型看起来像这样:
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()
?
答案 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()