2011-11-28 121 views
0

我有一個django項目,其中有5個不同的模型。他們都有日期字段。假設我想從今天的日期獲取所有模型中的所有條目。當然,我可以過濾每個模型,並將結果放在一個大列表中,但我相信這很糟糕。什麼是有效的方式來做到這一點?通過多個模型查詢

+0

有5個模型中所有日期字段的任何相關性接近這個?我的意思是爲什麼不制定它,以便你創建一個共同的日期字段? –

+0

@NagarajTantri模型之間沒有依賴關係(每個模型都代表項目的不同部分)。但是,我會如何製作普通的日期字段呢?通過模型繼承? – nukl

+0

關於組合查詢集有點相關的問題:http://stackoverflow.com/questions/431628 – akaihola

回答

4

我不認爲單獨查詢每個模型是一個壞主意 - 事實上,從數據庫的角度來看,我看不出你會怎麼做,否則,因爲每個模型都需要一個單獨的SQL查詢。即使像@Nagaraj所說的那樣,你爲每一個其他模型引用建立了一個通用的Date模型,你仍然需要分別查詢每個模型。你可能是正確的,但是,把成果轉化爲一個列表是不好的做法,除非你確實需要加載的每一個對象到內存中,爲解釋here

被警告,雖然,[評估查詢集爲一個列表]可能會有很大的內存開銷,因爲Django會將列表中的每個元素加載到內存中。相比之下,迭代QuerySet將利用數據庫加載數據並僅在需要時才實例化對象。

很難在不瞭解您的用例的情況下提出其他選項。不過,我覺得我可能會通過使查詢集的列表或字典,它然後我可以在我的視圖中使用,例如:

querysets = [cls.objects.filter(date=now) for cls in [Model1, Model2, Model3]] 
2

看看使用多重繼承(文檔here)來定義的,你可以在你想查詢返回的類繼承一個類的日期字段。

例如:

class DateStuff(db.Model): 
    date = db.DateProperty() 

class MyClass1(DateStuff): 
    ... 

class MyClass2(DateStuff): 
    ... 

我相信Django將讓你查詢在DateStuff類,它會從MyClass1的和MyClass2返回對象。

感謝@nrabinowitz指出我以前的錯誤。

+1

我很困惑 - PolyModel是Appengine特有的,不是嗎?它不是Django的一部分,我不認爲OP可以在這裏使用它。但是,關於繼承的觀點是一個很好的觀點 - 相關的Django文檔[可在此處獲得](https://docs.djangoproject.com/en/1.3/topics/db/models/#multi-table-inheritance)。 – nrabinowitz

+0

啊,你是對的。我的錯。 Django = App-Engine對我來說,所以我忽略了它。答案已被編輯。 – SteveShaffer