2015-10-29 73 views
0

我想選擇其中的值超過一個大於0Django的ORM:AND'ing的和排除查詢

class Item(models.Model): 
    val1 = models.PositiveIntegerField() 
    val2 = models.PositiveIntegerField() 
    val3 = models.PositiveIntegerField() 

我想這些應該消除項目所有val s爲0待辦事項:

Item.objects.exclude(val1=0, val2=0, val3=0) 
Item.objects.exclude(Q(val1=0) & Q(val2=0) & Q(val3=0)) 

他們都消滅每一個項目,其中一個val是零,並與所有val只返回那些š大於0。我不想OR組合,但找到一個通用的表達,因爲val可以均爲更多 3.

如何寫入查詢?謝謝。

回答

0

你可以使用鏈式過濾器來做到這一點:

Item.objects.filter(val1__gt=0).filter(val2__gt=0).filter(val3__gt=0) 

使用過濾器__gt只選擇那些大於該值的值。鏈接過濾器充當邏輯AND語句,因此這將排除所有三個值都爲0的任何情況。

編輯:

根據您的評論澄清您的實際需求,這樣的事情可能工作。 (這是未經測試)

Item.objects.filter((Q(val1__gt=0) & Q(val2__gt=0)) | 
        (Q(val2__gt=0) & Q(val3__gt=0)) | 
        (Q(val1__gt=0) & Q(val3__gt=0))) 

綁定多個ANDOR運營商在正確的順序應該得到你所需要的。

+0

但是這將返回僅返回具有大於0的所有'val'的項目。我想要具有至少2個'val'大於0的項目。 – omat

+0

我沒有看到之前,所以我添加了一個不同的查詢來處理這個問題。 – electrometro

+0

在這個問題中,我也提到過我不想做'OR'組合,因爲值實際上超過了3,但是這是我最後的選擇。謝謝:) – omat