2013-06-16 2 views
0

장고에서 일대 다 관계로 쿼리를 수행하는 가장 좋은 방법은 몇 가지 문제가 있습니다. 최상의 예를 들어 설명 :Django에서 OneToMany 쿼리

항목에는 여러 특성이있을 수 있습니다. 속성이 항목에만 적용되지만 ManyToMany는 여기에 적합하지 않습니다. name = a1 인 속성을 가진 모든 항목을 어떻게 찾을 수 있습니까? 그러나 name = a2 속성도 갖고 있습니까? 이 같은

뭔가 :

a1_objects = Attribute.objects.filter(name="a1").values("item__id") 
a2_objects = Attribute.objects.filter(name="a2").values("item__id") 
#Take the intersection (does this method of taking an intersection work?) 
ids_with_a1_and_a2 = [id for id in a1_objects if id in a2_objects] 
#Get item objects with those ids 
results = Item.objects.filter(id__in = ids_with_a1_and_a2) 

는 확실히 내 제안 된 방법보다 더 좋은 방법은? 그것은 나에게 효율적으로 보이지 않는다.

+0

귀하의 결과 __always__ 것 빈의 검색어합니다. 아이템 이름이'a1'과'a2' 인 모든 애트리뷰트 이름을 얻으시겠습니까? – karthikr

+0

Heh. 먼저 제목을 "장고에서 너무 많은 검색어 중 하나"라고 읽었습니다. 이렇게 많은 쿼리를하지 않는 것이 좋습니다! ;-) –

답변

0

확인 문서에서이 섹션 Spanning multi-valued relationships

가되지 않는 한 내가 Item 작동합니다 필터링, 무언가를 그리워 :

Item.objects.filter(attribute_name="a1").filter(attribute__name="a2") 
+0

감사합니다. 두 방향으로 관계를 확장 할 수 있다는 것을 알지 못했습니다. attribute__name에서 두 개의 밑줄이 필요하지만 완벽하게 작동해야합니다. – Dave

+0

좋은 캐치, 그냥 누락 된 밑줄을 추가했습니다. 당신이 어쨌든 그것을 알아낼 수 있기 때문에 다행! –

관련 문제