2011-05-06 56 views
1

我的模型:Django的 - 獲取的項目清單與過濾

Item: 
    name 
    desc 

Type: 
    name 

Value: 
    text 
    type.ForeignKey(Type) 
    item = ForeignKey(Item) 

我不得不從表型號類型的初步清單,假設T = [4,5,6]。現在我必須得到一個類型爲t的項目列表。例如:價值

數據列表:

type | item 
4  1 
5  1 
6  1 
4  2 
5  2 
4  3 

所以,如果T = [4,5,6],結果我需要是items = [<object: 1>]

UPDATE

t = [4,5] items = [<object: 1>, <object: 2>]

t = [4] items = [<object: 1>, <object: 2>, <object: 3>]

感謝您的幫助!

+0

我的解決方案的工作原理與您的想法完全相同(更新部分也一樣)。或者它不? – DrTyrsa 2011-05-06 08:51:15

+0

我要去測試:) 感謝朋友! – anhtran 2011-05-06 08:53:45

回答

2

不太清楚這是最好的解決方案,但它的工作原理

from itertools import groupby 

values = Value.objects.filter(type_id__in=t).values_list('type_id', 'item_id') 
values = sorted(values, key=lambda x: x[1]) 

items = [] 
for key, group in groupby(values, lambda x: x[1]): 
    types = [x[0] for x in group] 
    if set(t).issubset(set(types)): 
     items.append(key) 

items將containd IDS,而不是對象,但我不認爲這可能是一個問題。

Item.objects.filter(value__type__id__in = [4, 5, 6]) 

更新:以上將工作OR查詢,發現有任何指定類型的所有項目

1

您可以通過許多一對多的關係,其價值是過濾。要查找具有所有類型的所有項目,必須通過鏈接過濾器創建AND查詢:

q = Item.objects 
for id in [4, 5, 6]: 
    q = q.filter(value__type__id = id) 
print q.all() 
# or 
q = reduce(lambda q, i: q.filter(value__type__id = i), [4, 5, 6], Item.objects) 
print q.all() 
+1

並獲得具有類型[4],[4,5],[5,6]等的項目,但是任務是不同的。 – DrTyrsa 2011-05-06 08:50:01

+0

你說得對。我誤解了這個問題。 – 2011-05-06 09:09:09