Фильтрация опросов без выбора в учебнике по 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 в комментарии