【发布时间】:2014-07-23 19:38:13
【问题描述】:
我的模型存储标记为已读/未读的线程消息。当用户查看消息线程时,未读消息应显示为未读,然后在同一请求中标记为已读。
因为在模板中呈现查询集之前通常不会对其进行评估,因此我的理解是我需要按以下顺序执行此操作:
- 评估消息查询集以将消息已读/未读状态保留在内存中
- 调用更新以将消息标记为已读
- 使用评估的查询集呈现模板
否则,更新将首先执行,当随后在模板中评估消息查询集时,所有消息将被错误地呈现为已被读取。
实现步骤 1 的正确方法是简单地在查询集上调用 list() 吗?
例如:
class ViewMessageThread(TemplateView):
template_name = 'inbox/message_thread.html'
def get_context_data(self, **kwargs):
context = super(ViewMessageThread, self).get_context_data(**kwargs)
thread = MessageThread.objects.get(pk=self.kwargs['thread_id'])
context['messages'] = list(Message.objects.filter(thread=thread)) # evaluate
Message.objects.filter(thread=thread).update(status='read') # update
return context
django docs 包含一个警告,不要以这种方式评估查询集,因为涉及到内存开销。我不希望消息线程包含大量消息,并且查询集将以一种或另一种方式评估(在视图中或在模板中)。
是否有不同的首选方法来处理此问题?或者这样可以吗?
谢谢!
【问题讨论】: