我已经构建了一个Django站点来列出当前和即将发生的服务中断。除非我重新启动Apache服务,否则查询不会刷新。它会抓取我添加的新消息,但存在不一致。
我正在运行以下内容。
视图是
class MessageViewMixin(object):
queryset = Message.objects.filter(message_type__id=1
).filter(inactive=False
).filter(start_time__range=(now, nextweek)
).order_by('-start_time', '-end_time')
context_object_name = 'upcoming_list'
def get_context_data(self, **kwargs):
context = super(MessageViewMixin, self).get_context_data(**kwargs)
context['current_list'] = Message.objects.filter(
inactive=False
).filter(
Q(message_type__id=1) | Q(message_type__id=2)
).filter(
Q(end_time__isnull=True) | Q(end_time__gte=now)
).filter(start_time__lte=now
).order_by('-start_time', '-end_time')
return context
所以coming_list是对下周中断的查询。当中断发生时,消息现在应该属于current_list。除非我重新启动Apache,否则不会发生这种情况。
答案 0 :(得分:1)
我在博客上发表了关于此问题的信息here。
总结一下这篇文章,虽然查询集确实是懒惰的,并且仅在调用视图时进行评估,但now
的定义不是。正如Tomita所说,答案是在get_queryset
中定义它。
答案 1 :(得分:0)
您描述的行为正是您应该期待的。您将查询放在类定义中。它会立即进行评估并分配给变量queryset
。
相反,覆盖每次调用的get_queryset
..
def get_queryset(self):
return Message.objects.filter(message_type__id=1
).filter(inactive=False
).filter(start_time__range=(now, nextweek)
).order_by('-start_time', '-end_time')