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.