2014-04-09 9 views
3

일반적인 예. 이런 질문을 할 때Django 쿼리는 동일한 객체를 두 번 반환합니다.

a = MyObject.objects.filter(...) 

에는 필터와 일치하는 모든 것이 포함됩니다. 그러면 내가 할 때 :

a.filter(...) 

a는 두 필터와 일치하는 개체 만 포함합니다. 맞습니까? 따라서 첫 번째 필터() 이후에 5 개의 요소가있을 수 있고 두 번째 필터() 뒤에 2 개의 필터가 남을 수 있습니까?

내 검색어 중 하나와 함께 이상한 결과가 나타납니다. 다음 쿼리 :

>>> Item.objects.filter(account__in=Account.objects.filter(customer=a), disabled=False) 
[<Item: PSN-100396>] 

결과가 하나입니다. 100396은 기본 키이므로이 idnetifier가있는 항목은 하나만있을 수 있습니다. 나는 장애인 송장 또는 전혀 송장에있는 항목 만 표시해야합니다 추가 필터를 적용 할 때 현재 :

>>> Item.objects.filter(account__in=Account.objects.filter(customer=a), disabled=False).filter(Q(iteminv__invoice__disabled=False) | Q(iteminv__isnull=True)) 
[<Item: PSN-100396>, <Item: PSN-100396>] 

나는 두 번 같은 개체와이 결과를 얻기를 ... 어떻게 이런 일이 가능할까요? 내가 뭔가를 오해 했니?

하면() 같은 이상한 출력 생성 한 필터에 모든 퍼팅 :

>>> Item.objects.filter(Q(account__in=Account.objects.filter(customer=a)), Q(disabled=False), Q(iteminv__invoice__disabled=False) | Q(iteminv__isnull=True)) 
[<Item: PSN-100396>, <Item: PSN-100396>] 

장고 버전 1.6.2

+0

SQL 쿼리를 살펴 보았습니까? 그것은 어딘가에 합류하고 있을지 모른다. –

+0

그것이 진행되고있는 것처럼 보입니다. 인터넷 검색을하면서 .distinct()를 추가하여 정렬 할 수 있다는 것을 알았지 만 왜 중복을 생성하는지 이해할 수 없습니다. 나는 잠시 동안 장고를 사용 해왔다. 복잡한 쿼리에서도이 동작을 본 적이 없다. – Eldamir

답변

6

인해 필터링 때 관여 조인 발을 대다 관계 또는 역방향 외래 키 관계 인스턴스는 결과 집합에 두 번 나타날 수 있습니다 (이 경우 Django는 주로 중복을 생성 할 수있는 INNER JOIN을 applay합니다). 따라서 귀하는 귀하의 질의에 distinct()을 사용해야합니다. (SQL 쿼리의 조인은 테이블에 Account이있는 모든 관계에 대해 Item을 표시합니다.)

다 대다 관계에 대한 필터링은 the examples in the django documentation도 참조하십시오.

EDIT : SQL/and 및/또는 생성 된 쿼리를 검사하려면 print Item.objects.filter(your_query).query과 같은 작업을 수행하십시오.

+0

감사합니다. 필요한 정보 만 – Eldamir

관련 문제