2012-01-16 17 views
0

我有一堆Widget對象。如何正確創建一個Django QuerySet,其中某個字段的值在列表中?

現在每個小部件都有一個名爲'foo'的字符串屬性。我需要能夠查詢具有'foo'設置爲'紅色','橙色','綠色'或任意顏色的Widgets,並且只包含具有適當'foo'屬性的Widgets。此外,這些顏色來自用戶輸入,所以我不能相信他們。我寧願不加載所有結果,然後過濾它們,而是在SQL中執行此操作。

但是......我只能看到用「AND」連接子句的方法,從來沒有「OR」。而「in」是垃圾('in'只適用於數字ID或子查詢集,這可以減少相同的問題!)。我嘗試了一些其他的東西,但他們似乎沒有工作。

基本上,我在問如何表達這個作爲下面的filterQuery的關鍵。

myNiceWidgets = Widget.objects.filter(**filterQuery).orderBy(...) 

謝謝。

回答

3

要使用OR,請查看django的Q對象。

https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

Widget.objects.filter(Q(foo='red') | Q(foo='green'), **filterQuery) 

它將還不如將q對象的filterQuery一項重點工作必須是一個位置參數。

查找函數可以混合使用Q對象和關鍵字參數。 提供給查找功能的所有參數(不管它們是關鍵字參數 還是Q對象)都是「與」一起編輯的。但是,如果提供了Q對象 ,則必須先於任何關鍵字參數的定義。對於 例如:

+0

謝謝。奇怪的是我沒有在Django文檔中碰到這個。欣賞它,Yuji。 – 2012-01-16 18:59:22

2

此:

'在' 只適用於數字ID或子查詢集

是無義。 in很好,有一個名字列表:

Widget.objects.filter(foo__in=['red', 'orange', 'green', 'blue']) 
+0

這可能是 - 有問題的領域實際上是一個外鍵,這就是爲什麼它試圖把所有東西都變成「int」。 – 2012-01-16 18:57:07

+1

@AlanH如果你想查詢目標表上的*字段*,你可以使用雙下劃線語法'Widget.objects.filter(foo__color__in = ['red','orange'])' – 2012-01-16 19:42:39

0

謝謝你的答案!

我也結束了在列表理解中做了幾個子查詢,然後抓住這些ID並使用in。這是(希望)值得的,因爲我稍後在請求中使用了中間對象。

+0

......但我應該在一個查詢中完成了這項工作。正如丹尼爾所說,可能一個'__in'查詢可以做到這一點。 – 2012-01-18 03:12:39

相關問題