2014-12-10 3 views
0

두 모델이 있습니다 : OrderOrderStatus입니다.Django - 여러 역방향 조회 일치에서 쿼리 세트를 필터링하는 방법

주문에 대해 걱정하지 마십시오,하지만 OrderStatus는 다음과 같은 필드가 있습니다

order = models.ForiegnKey(Order) 
status = models.CharField (choice that can be either ORDERED, IN_TRANSIT, or RECEIVED) 

OrderStatuses는 주문 상태가 변경 될 때 생성, 그래서 처음에 다음, 나중에 ORDEREDIN_TRANSIT 상태 단지 ORDERED 상태 거기에있다, 나중에 ORDERED, IN_TRANSITRECIEVED 상태는 모두 하나의 주문에 대한 foriegn 키로 존재합니다. 이것은 타이밍 등을 추적하는 것입니다.

세 가지 상태를 모두 가진 모든 주문을 찾고 싶습니다. 즉, 수신 된 모든 주문은 다른 두 상태를 가지고 있기 때문에 유효합니다.

는 빈 세트 반환 :

Order.objects.filter(Q(orderstatus__status=OrderStatus.ORDERED) & 
        Q(orderstatus__status=OrderStatus.IN_TRANSIT) & 
        Q(orderstatus__status=OrderStatus.RECEIVED))): 

을 ...하지만이 잘 작동 :

Order.objects.filter(orderstatus__status=OrderStatus.ORDERED) 
      .filter(orderstatus__status=OrderStatus.IN_TRANSIT) 
      .filter(orderstatus__status=OrderStatus.RECEIVED) 

의 차이가 여기에 무엇입니까? 단순화 할 방법이 있습니까? 나는 이것이 Q 객체가 원하는 것이라고 생각했다.

답변

1

이는 모든 필드는이 제 필터

를 그 결과에 적용하는 제 3 필터, 제 2 필터 및 제 2 필터의 결과에 적용되는 것을 의미

Order.objects.filter(Q(orderstatus__status=OrderStatus.ORDERED) & 
         Q(orderstatus__status=OrderStatus.IN_TRANSIT) & 
         Q(orderstatus__status=OrderStatus.RECEIVED))): 

필요한 질의를 의미

Order.objects.filter(orderstatus__status=OrderStatus.ORDERED) 
      .filter(orderstatus__status=OrderStatus.IN_TRANSIT) 
      .filter(orderstatus__status=OrderStatus.RECEIVED) 

당신은 자신의 상태가 ORDERED 경우 Order 객체를 얻고 싶은 일을하려면, RECEIVEDORIN_TRANSIT 당신은 또한 같은 뭔가를 할 수 이

Order.objects.filter(orderstatus__status__in=[OrderStatus.ORDERED, OrderStatus.IN_TRANSIT, OrderStatus.RECEIVED]) 
+0

감사합니다. 말이된다. 트리플 필터를 단순화하는 방법은 없나요? – grokpot

+0

출력으로 정확히 무엇을 원하십니까? 세 가지 상태가 모두 포함 된 '주문'을 원하십니까? 그 상태에 많은 것에서 많은 것이 있습니까, 아니면 어떻게 연결되어 있습니까? – abhishekgarg

+0

예, 단일 필터로 찾을 수 있습니까? – grokpot

관련 문제