2015-11-04 49 views
0

我有一個django應用程序,我在一個循環中迭代地執行過濾器。 下面是一個簡單的例子:django - 改進迭代查詢

class Decision(models.Model): 
    recommendation = models.TextField() 

class Condition(models.Model): 
    dec = models.ForeignKey(Decision, related_name='condition') 
    temperature = models.PositiveInteger() 
    pressure = models.PositiveInteger() 

Decision.objects.filter(condition__temperature=22, condition__pressure=123).filter(condition__temperature=30, condition__pressure=144).values_list('id',flat=True) 

正如你所看到的,條件與。 有沒有更有效的方法來做這個查詢?

這裏是另一種方法,但它不給我任何結果:

Decision.objects.filter(Q(condition__temperature=22, condition__pressure=123) &\ 
    Q(condition__temperature=30, condition__pressure=144)).values_list('id',flat=True) 
+0

我有點意外的是,第一個查詢顯然是給你的結果;我認爲過濾器鏈,正如你所述,AND-ed,因此第一個過濾器排除第二個過濾器(因爲'condition__temperature = 22'不包括'condition_temperature = 30')。這就是你確實(正確的,我認爲)採取你的另一種方法。這個問題可能是:你想達到什麼,結合兩個獨佔條件? – Evert

+0

參見http://stackoverflow.com/questions/8164675/chaining-multiple-filter-in-django-is-this-a-bug。過濾器鏈確實是OR-ed在一起,因此爲了在第二種方法中獲得相同的行爲,請用&替換&。如果這確實是你想要的。 – Evert

回答

0

你跟你的查詢,幾乎是正確的,但它一定是OR

Decision.objects.filter(
    Q(condition__temperature=22, condition__pressure=123) | # OR 
    Q(condition__temperature=30, condition__pressure=144) 
).values_list('id',flat=True) 

很顯然,你的病情的溫度同時也不能是22 AND 30。

你可以做同樣的條件清單:

from operator import or_ 
from django.db.models import Q 

predicates = [ 
    {'condition__temperature': 22, 'condition__pressure': 123}, 
    {'condition__temperature': 30, 'condition__pressure': 144}] 
conditions = [Q(x) for x in predicates] 
query = Decision.objects.filter(reduce(or_, conditions)) 

你可以閱讀Q這裏充滿文檔:django-docs

+0

從條件到決策有一個外鍵,這意味着你可以有2個溫度(在不同的位置)。也許我的例子不好,但棘手的部分是這是一對多的關係,所以你所建議的不適合我。不過謝謝。 – max