2015-05-29 49 views
1

我有以下查詢集屬性的CBV:爲什麼我CBV查詢集屬性只計算一次

queryset = sorted(                                               
     chain(models.Event.objects.filter(is_published=True), models.Seminar.objects.filter(is_published=True)), 
     key=attrgetter('start_date'), reverse=True) 

,因爲我希望我的觀點在這兩種模式工作(返回他們都在我這樣做相同的對象列表,分頁等)。問題是queryset始終包含服務器重置後的值。如果我更改管理員中的任何內容,則在重新啓動服務器之前,queryset不會更改。我想這是因爲表達式只被評估一次?

通過覆蓋get_queryset方法的工作原理,但我想知道爲什麼它不能直接將它分配給queryset屬性。

回答

2

這就是當你在課堂上定義事物時發生的情況。任何代碼在第一次導入的時候都會被評估一次,當這個類本身被定義的時候。

你可以通過調用sorted來顯式地評估你的查詢集,所以它不再是懶惰的。

您是否知道get_queryset方法;這正是它的目的。

+0

啊,我明白了。 **懶惰**部分是這裏的關鍵。謝謝! – argaen

+0

從技術上講,這是因爲'get_queryset()'調用了queryset.all(),它重新評估查詢集,如果self.queryset不是'QuerySet'實例,則不會發生這種情況。分配一個普通的查詢集,即使它被評估,也能正常工作。 – knbk

相關問題