在更新之前评估查询集

时间:2014-07-23 19:38:13

标签: django django-queryset

我的模型存储标记为已读/未读的线程消息。当用户查看消息线程时,未读消息应显示为未读,然后在同一请求中标记为已读。

因为在模板中呈现查询集之前通常不会对其进行求值,所以我的理解是我需要按以下顺序执行此操作:

  1. 评估消息查询集以在内存中保留消息已读/未读状态
  2. 调用更新以将邮件标记为已读
  3. 使用评估的查询集
  4. 渲染模板

    否则,更新将首先执行,并且当随后在模板中评估消息查询集时,所有消息将被错误地呈现为已经被读取。

    实现步骤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包含以此方式评估查询集的警告。我不希望消息线程包含大量消息,并且将以这种或那种方式(在视图中或在模板中)评估查询集。

    是否有不同的,首选的处理方法?或者这很好吗?

    谢谢!

1 个答案:

答案 0 :(得分:0)

我觉得很好,但我会改变一件事:你执行过滤器两次。我会这样做:

_query = Message.objects.filter(thread=thread)
context['messages'] = list(_query)
_query.update(status='read')
return context