2015-05-06 61 views
0

我有一個表/模型'ABC'有兩個列字段'A'和'B'。我想查詢上表如下:Django選擇查詢以獲得多個條件的列

select A, B from ABC where B is not null; 

我能夠做

select A, B from ABC; 

,但我不知道如何引進空校驗條件。 我嘗試沒有成功如下:

ABC.objects.values('A', 'B') # which is getting all the tuples including null valued 'B' column 
ABC.objects.values('A', 'B', 'B__isnull=False') # which is incorrect 
ABC.objects.values('A', 'B__isnull=False') # which is incorrect again. 

有人能提供正確的格式/查詢,我可以使用?

謝謝。

回答

2

沒關係,我知道了:)

ABC.objects.values('A', 'B').exclude(B__isnull=True) 
1

嘗試使用filter方法:

ABC.objects.filter(B__isnull=False).values('A', 'B') 

至於你提到它,也可以使用exclude

exclude方法是一樣的過濾器,它只是把一個not圍繞匹配的條件。它們是完美的對立面,只是在某些情況下,代碼會更好地使用濾鏡來讀取,並排除其他條件。

有大約當像excludevalues調用的順序,但它沒有邏輯區別文檔one minor note

最後,注意,ValuesQuerySet是查詢集和它的子類實現了大多數相同的方法。你可以在它調用過濾器(),ORDER_BY(),等等。這意味着,這兩個調用是相同的:

Blog.objects.values().order_by('id') 
Blog.objects.order_by('id').values() 

誰做的Django喜歡先把所有的SQL-影響方法的人,(可選)跟隨任何影響輸出的方法(如values()),但它並不重要。這是你真正炫耀你的個人主義的機會。

+0

其實我用得到的答案 「ABC.objects.values( 'A', 'B')。排除(B__isnull = TRUE)」。你能告訴我哪種方法更好,爲什麼? –

+1

「排除」基本上是一個「過濾器」,其前面不是NOT。 – Steve