Why .filter() in django returns duplicated objects?

choice__isnull causes the problem. It leads to join with choice table (to weed out questions without choices), that is something like this:

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

You can inspect query attribute of QuerySet to be sure. So if you have one question with two choices, you will get that question two times. You need to use distinct() method in this case: queryset.distinct().


Just use .distinct() at the end of your ORM.


A little late to the party, but I figured it could help others looking up the same issue. Instead of using choice__isnull=False with the filter() method, use it with exclude() instead to exclude out any questions without any choices. So your code would look something like this:

    ...
    def get_queryset(self):
        return Question.objects.filter(pub_date__lte=timezone.now()).exclude(choice__isnull=True).order_by('-pub_date')[:5]

By doing it this way, it will return only one instance of the question. Be sure to use choice_isnull=True though.

Tags:

Django