Фильтрация опросов без выбора в учебнике по Django приводит к дублированию опросов в индексе

Я отредактировал код из учебника, чтобы индексное представление выглядело так:

class IndexView(generic.ListView):
    template_name = 'polls/index.html'
    context_object_name = 'latest_poll_list'

    def get_queryset(self):
        """
        Return the last five published polls (not including those set to be
        published in the future, or those without choices).
        """
        return Poll.objects.filter(
            pub_date__lte=timezone.now(), choice__choice_text__isnull=False
        ).order_by('-pub_date')[:5]

Но теперь мой индекс выглядит так:

  • че почем? Чем занимаешься?
  • че почем? Чем занимаешься?
  • че почем? Чем занимаешься?
  • Что происходит?
  • Что происходит?

Как это случилось? И как мне это исправить?

(PS Я понятия не имел, кто должен использовать фильтр, поэтому я скопировал код из этого вопроса. Вот почему это не работает? Как двойное подчеркивание __ обозначения работают в фильтре?)

Изменить: я проверил представление администратора, и, кажется, только один из каждого опроса в БД (я не проверял напрямую), но я уверен, что при его настройке я не мог иметь несколько опросов с одинаковым идентификатором (что имеет место, все опросы "Что ты задумал?" имеют идентификатор 2, все опросы "Что?" имеют идентификатор 1).

1 ответ

Решение

Добавление distinct() (как предлагает Wolph), чтобы цепочка методов действительно работала. Я думаю, суть проблемы в том, что возможный запрос к БД возвращает комбинацию недавних опросов (pub_date__lte=timezone.now()) И опросы с ненулевым выбором (choice__choice_text__isnull=False) независимо от перекрытия.

Я не уверен в лучшем способе предотвратить это в корне, чем просто использование distinct() , Я попытался соединить фильтры, и это, кажется, не имеет значения.

Оказывается, отличным является правильное решение:

"Я выполнил поиск по объяснению, и, похоже, что когда запрос охватывает несколько таблиц, он может возвращать дубликаты. Отличное - правильное решение здесь".
- Ludovic Viaud в комментарии

Другие вопросы по тегам