Do the polls being returned have choices? It looks like it's returning one instance of a poll for every associated choice, resulting in duplicates. To get rid of these, use distinct()
:
Poll.objects.filter(choice__choice_text__isnull=False).distinct()
Update: let's go under the hood. Your first query is spanning the Poll-Choice relationship, using a JOIN behind-the-scenes to "combine" the two tables. (JOINs can be complicated, so if this is confusing I suggest researching them.) Your query is returning a Poll object for every Choice whose text is null.
On the other hand, your second query is simply selecting from your Poll table. The line:
Poll.objects.filter(pub_date__lte=timezone.now)
translates to SELECT * FROM poll WHERE pub_date <= tz.now
. For more details on field lookups, see the docs. For more guidance on spanning relationships, see the docs again.