2011-05-06 2 views
1

내 모델 항목의 목록을 가져옵니다 : 장고 - 필터와

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], 그 결과는 I 필요 즉 items = [<object: 1>]

UPDATE 인 경우

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

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

도움 주셔서 감사합니다.

+0

Му 솔루션은 원하는대로 정확히 작동합니다 (업데이트 섹션에서도 마찬가지 임). 그렇지 않습니까? – DrTyrsa

+0

시험 할게요. 고마워요! – anhtran

답변

2

은 아주 확실하지 않음이 가장 좋은 방법이지만, IDS가 아닌 객체를 containd합니다

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

을 작동하지만, 나는 그것이 문제가 될 수 있다고 생각하지 않습니다.

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

+0

당신 말이 맞아요. 나는 그 질문을 잘못 읽었다. –