2014-12-10 62 views
0

我有兩個模型:OrderOrderStatusDjango - 如何過濾多個反向查詢匹配的查詢集

不要擔心訂單,但OrderStatus具有以下字段:

order = models.ForiegnKey(Order) 
status = models.CharField (choice that can be either ORDERED, IN_TRANSIT, or RECEIVED) 

OrderStatuses在創建時訂單狀態改變,所以最初也只是一個ORDERED狀態,再後來的ORDEREDIN_TRANSIT狀態,那麼後來的一個ORDERED,IN_TRANSITRECIEVED狀態全部作爲foriegn鍵存在於一個Order中。這是爲了跟蹤時間等。

我想找到所有具有所有三種狀態的訂單。換句話說,所有已收到的訂單都是有效的,因爲它們具有其他兩種狀態。

這是返回一個空集:

Order.objects.filter(Q(orderstatus__status=OrderStatus.ORDERED) & 
        Q(orderstatus__status=OrderStatus.IN_TRANSIT) & 
        Q(orderstatus__status=OrderStatus.RECEIVED))): 

...但是這是工作的罰款:

Order.objects.filter(orderstatus__status=OrderStatus.ORDERED) 
      .filter(orderstatus__status=OrderStatus.IN_TRANSIT) 
      .filter(orderstatus__status=OrderStatus.RECEIVED) 

這裏有什麼區別?有什麼辦法可以簡化嗎?我認爲這是Q對象的用途。

回答

1

這意味着,所有的字段是必需

Order.objects.filter(Q(orderstatus__status=OrderStatus.ORDERED) & 
         Q(orderstatus__status=OrderStatus.IN_TRANSIT) & 
         Q(orderstatus__status=OrderStatus.RECEIVED))): 

這意味着,第三過濾器上第二過濾器和所述第二過濾器的結果施加被施加於第一濾波器

的結果的查詢
Order.objects.filter(orderstatus__status=OrderStatus.ORDERED) 
      .filter(orderstatus__status=OrderStatus.IN_TRANSIT) 
      .filter(orderstatus__status=OrderStatus.RECEIVED) 

如果你想要做的,你想要得到的Order對象,如果他們的狀態是ORDERED東西,RECEIVEDORIN_TRANSIT你也可以這樣做這

Order.objects.filter(orderstatus__status__in=[OrderStatus.ORDERED, OrderStatus.IN_TRANSIT, OrderStatus.RECEIVED]) 
+0

謝謝。說得通。任何方式來簡化三重過濾器? – grokpot 2014-12-10 21:37:06

+0

你想要什麼作爲輸出?你想要包含所有三個狀態的'Order'嗎?在該狀態下是否有多對多的連接? – abhishekgarg 2014-12-10 21:37:50

+0

是的,是否有可能通過單個過濾器來查找? – grokpot 2014-12-10 21:40:53