2011-08-13 67 views
0

我有三個模型,其中有一些共同但不是確切的領域,從單個視圖前。回家我檢索這樣在不同的模型Django視圖中的複雜查詢

interviews = Interviews.objects.all().order_by('pub_date')[:3] 
publications = Publications.objects.all().order_by('pub_date')[:3] 
published = Published.objects.all().order_by('pub_date')[:3] 

從主頁視圖我希望他們能夠在模板中顯示的命令,所有與這些模型相關的最新/新項目將在頂部。

一樣,如果進入面試10是最近在這些所有車型進入,那麼這將是第一次,那麼如果一個公佈第二是最近這將是第二次...等.etc

任何一個可以告訴我該怎麼做?

回答

0

根據您的其他要求,將它們製作爲包含常見元素的常見超類的子版本可能是一個好主意。

這很難說,如果它是有效的,但如果你這樣做,你可以通過調用

SuperClass.objects.all().order_by('-pub_date')[:9] 

將呈現什麼樣sublcass他們是9個第一對象regerdless單獨或一起查詢不同類型的對象。當然假設超類被命名爲SuperClass。當然這並不能保證每個模型都有3個。

解決這個問題的另一個簡單方法 - 雖然承認不使用查詢,但僅僅是對列表進行排序。

entries = sorted(list(interviews) + list(publications) + list(published), key=lambda x: x.pub_date, reverse=True) 

應該工作 - 基本上把它們變成列表並整理它們。

+0

有什麼辦法,我能得到像面試子類的名字,所以我可以作爲一個類別名稱打印 – themunna

+0

[模型inherticance在文檔](https://docs.djangoproject.com/en/dev/topics/db/models/#model-inheritance):要從超類對象中獲得一個子類,你可以使用entry.interview, entry.publication或entry.published來獲取每個相應的子類對象。如果是採訪,則另外兩個未設置。 – niklasdstrom

+0

有點用過這個解決方案,但沒有使用超類 – themunna

0

一種可能的方式是使用lambda對數據進行排序,但成本hiher因爲你這樣做是爲了蟒蛇,不DBMS ...

lst = [] 
lst.extend(list(Interviews.objects.order_by('pub_date')[:10])) 
lst.extend(list(Publications.objects.order_by('pub_date')[:10])) 
lst.extend(list(Published.objects.order_by('pub_date')[:10])) 
# take 10 records for each, since you could not know how many records will be picked from which table 
# now order them... 
lst.sort(lambda x, y: cmp(x.pub_date, y.pub_date)) 
# and reverse the order, so newset is the first... 
lst.reverse() 

這會給你一個列表對象的有序PY PUB_DATE,這樣你就可以切片最終名單得到任何數量的你想記錄...

lst = lst[:10]