django:在get_context_data中对get_queryset结果进行计算

2 投票
1 回答
953 浏览
提问于 2025-04-17 23:50

在使用Django的通用列表视图(ListView)时,我想加入一些额外的上下文数据,这些数据是根据get_queryset的结果计算出来的,比如:

class BookListView(ListView):

    model = Book
    context_object_name = 'book_list'
    template_name = 'book_list.html'

    def get_queryset(self, *args, **kwargs):
        qset = super(BookListView, self).get_queryset(*args, **kwargs)
        return qset.filter(owner=self.request.user)

    def get_context_data(self, **kwargs):
        context = super(BookListView, self).get_context_data(**kwargs)
        // just take this as an example, here the extra context data may be some 
        // complex result which is calculated against the result of get_queryset
        context['2012_books_nr'] = self.get_queryset().filter(publish_year='2012').count()
        return context

这样做会造成性能或其他方面的问题吗?感觉有点奇怪,有没有更好的方法来实现这个?

另外,我在get_context_data中调用get_queryset时没有传任何参数,我怎么能确保得到的结果和自动调用时完全一样呢?

如果有什么方法可以在进入get_context_data之前就保存get_queryset的结果,那就太完美了,这种方法存在吗?

1 个回答

3

这没问题,但有一点需要注意,你应该使用查询集的 .count() 方法,而不是直接对它用 len()

撰写回答