2009-12-08 215 views
1

我有一堆Order對象,每個都連接到一個或多個OrderRow對象(與Order.order_rows.all(可視爲與其父對象的反向關係) ))。Django:根據相關模型的計數差異過濾模型

每個OrderRow有一個collection_status屬性,可以是'收集','未收集'或一堆其他特殊值。每個訂單都有一個狀態屬性,其中一個有效值是'處理'。

我很遺憾嘗試構建一個訂單查詢集,該訂單查詢集使用以下條件列出訂單對象:訂單狀態爲'處理',其訂單行的數量小於其OrderRows的總數。完全沒有收集或部分收集但未完全收集的訂單,即。

爲了把它在一個明確的方式:

訂購兩排,既有「未收」:列入QS
訂單有三排,一個「收集」,兩個「未收」:包含在QS
訂購兩行,均爲'收集':不包含在QS中!

(可以替換「未收」與不「收集」和標準仍然是相同的任何其他值;它的「收集」與任何其他collection_status)

我就得到作爲Order.objects.filter(status__exact ='處理'),但除此之外,我對註釋,Q()等對象的嘗試都失敗了。

+0

如果您選擇至少有一個「未收集」的訂單,該怎麼辦?那不是那個意思嗎? 'filter(order_rows__collection_status =「uncollected」)' – Ski 2011-01-10 18:09:21

回答

0

我重讀你的問題至少30次。讓我看看我是否明白你需要什麼。

這是行不通的,因爲任何一個訂單== OrderRow.collection_status '收集' 將被排除在外

Order.objects.filter(status='processing').exclude(order_row__collection_status='collected') 

讓我們試試別的

orders=Order.objects.filter(status='processing') 
arr=[] 
for order in orders: 
    col=order.order_rows.filter(collection_status='collected') 
    if col.count() < order.order_rows.all().count(): 
    arr.append(order.pk) 

orders=orders.filter(pk__in=arr) 

只是爲了澄清

其collection_status ='收集'OrderRows的數量少於其OrderRows的總數

讀你的問題了31時之後似乎任何訂單可能有OrderRows總數將始終> =應與29列訂單,收集的「收集」 OrderRows

數14和另外15個包括在內? 29行,15個訂單和14個訂單呢?

+0

我最終將查詢拆分爲兩個操作,第一個使用原始SQL獲取正確的一組訂單PK,另一個使用pk__in過濾器(與您一樣)構造QuerySet在他們之外。結束比第一部分使用QuerySets更快。我只希望有一個優雅的單一查詢解決方案。 對於使用29行的訂單的最終問題:收集/未收集的比率是14/15,15/14,1/28還是28/1無關緊要。只要它不是29/0(全部收集),那麼它應該包含在查詢集中。 – 2009-12-19 11:33:23