2013-04-02 3 views
2

djangoproject의 튜토리얼에 이어 2 개의 폴을 가진 폴을 만들었습니다. 단지 2 개의 여론 조사가 비록 Poll.objects.filter() 동일한 폴링의 여러 인스턴스를 반환합니다

In [14]: Poll.objects.all() 
Out[14]: [<Poll: poll1>, <Poll: poll2>] 

내가 필터

In [18]: Poll.objects.filter(choice__choice_text__isnull=False) 

다음이 반환에게 적용

.

Out[18]: [<Poll: poll1>, <Poll: poll1>, <Poll: poll1>, <Poll: poll2>, <Poll: poll2>, <Poll: poll2>] 

같은 설문 조사가 여러 번 발생하는 이유는 무엇입니까? 필터의 목적은 선택 사항이없는 폴을 필터링하는 것입니다. 또한 아래의 필터가 작동합니다.

In [19]: Poll.objects.filter(pub_date__lte=timezone.now) 
Out[19]: [<Poll: poll1>, <Poll: poll2>] 

답변

3

반환되는 설문 조사에는 선택 사항이 있습니까? 연결된 모든 선택 항목에 대해 하나의 설문 조사 인스턴스가 반환되어 중복되는 결과를 얻은 것으로 보입니다.

Poll.objects.filter(choice__choice_text__isnull=False).distinct() 

업데이트을 : :이 제거하는, distinct()를 사용의 후드 아래에 가자. 첫 번째 쿼리는 Poll-Choice 관계에 걸쳐 있으며 JOIN을 사용하여 두 테이블을 "결합"합니다. (JOIN은 복잡 할 수 있으므로 혼란 스럽다면 연구 해보는 것이 좋습니다.) 쿼리는 텍스트가 null 인 모든 선택 항목에 대해 Poll 개체를 반환합니다.

반면에 두 번째 쿼리는 단순히 설문 조사 테이블에서 선택하는 것입니다. 줄 :

Poll.objects.filter(pub_date__lte=timezone.now) 

SELECT * FROM poll WHERE pub_date <= tz.now로 변환됩니다. 필드 조회에 대한 자세한 내용은 the docs을 참조하십시오. 스패닝 관계에 대한 자세한 내용은 the docs again을 참조하십시오.

+0

예 각각의 게시물에 3이 있습니다. 왜 첫 번째 필터가 아닌 다른 필터가 두 번째 필터를 반환합니까? – bab

+0

@student 그는 아주 좋은 설명으로 자신의 게시물을 업데이 트했다. – Ngenator

+0

감사합니다 Cianan, 내가 필터를 한 방식이 선택이없는 투표를하는 가장 효과적인 방법이라고 생각합니까? – bab

관련 문제