2016-07-19 2 views
1

나는 장고 튜토리얼을 따라 갔고 tutorial05에 도착했다. 왜 django의 .filter()가 중복 객체를 반환합니까?

나는 튜토리얼 말한대로 빈 설문 조사를 표시하지 않도록 노력했다, 그래서 나는이 같은 필터 조건 추가 :

class IndexView(generic.ListView): 
    ... 
    def get_queryset(self): 
     return Question.objects.filter(
      pub_date__lte=timezone.now(), 
      choice__isnull=False 
     ).order_by('-pub_date')[:5] 

을하지만이 정확히 동일한 두 개체를 반환했습니다.

생각해 보니 선택 사항 _isnull = 거짓이 문제를 일으켰지 만 확실하지 않습니다.

+0

데이터베이스에 동일한 값을 가진 두 개의 별개의 개체가 있습니다. – Sayse

+0

동일한 개체 인 경우 개체 ID를 확인한 다음 중복 된 레코드를 반환하는 것이 좋습니다. – MaNKuR

+0

@Sayse 테이블 polls_question을 조회했지만 폴링 중복이 없습니다. –

답변

5

choice__isnull이 문제의 원인입니다.

SELECT question.* 
    FROM question 
    JOIN choice 
    ON question.id = choice.question_id 
WHERE question.pub_date < NOW() 

당신은 확실하게 QuerySetquery 속성을 검사 할 수 있습니다 : 그것은 choice 테이블과 참여 유도, 즉이 같은 것입니다 (choices없이 questions을 걸러합니다). 따라서 questionchoices 두 개가있는 경우 question 두 번 받게됩니다. 이 경우 distinct() 메서드를 사용해야합니다 (queryset.distinct()).

+0

예, 그게 문제였습니다. 쿼리를보고, INNER JOIN을했습니다. 고마워. –

-1

동일한 속성을 가진 두 개의 객체를 만들었 기 때문에. 고유성을 보장하려면 clean에 유효성 검사를 추가하고 식별자 필드에 고유 색인을 추가해야합니다.

게다가 filter은 조건과 일치하는 모든 개체를 반환하며, 하나의 항목 만 반환 될 것으로 예상되는 경우 get을 대신 사용해야합니다. get은 1 개보다 적거나 많은 항목이 발견되면 예외를 발생시킵니다.

관련 문제