Django 3.2.3 Пагинация не работает должным образом

У меня есть представление на основе классов, которое работает неправильно (дублирование объектов и удаление некоторых). Протестировал его в shell

from django.core.paginator import Paginator
from report.models import Grade, Exam

f = Exam.objects.all().filter(id=7)[0].full_mark
all = Grade.objects.all().filter(exam_id=7, value__gte=(f*0.95)).order_by('-value')
p = Paginator(all, 12)
for i in p.page(1).object_list:
...     print(i.id)

2826 2617 2591 2912 2796 2865 2408 2501 2466 2681 2616 2563

for i in p.page(2).object_list:
...     print(i.id)

2558 2466 2563 2920 2681 2824 2498 2854 2546 2606 2598 2614

Вызов order_by перед передачей query_set all в пагинацию является корнем проблемы и хорошо объяснен здесь. Все, что вам нужно, это вызвать distinct() или указать другое поле в order_by для использования в случае того же value.

Ниже приведен код, который должен работать, вам также не нужно использовать all() в ваших запросах. Фильтр по умолчанию применяется ко всем объектам модели.

from django.core.paginator import Paginator
from report.models import Grade, Exam

f = Exam.objects.filter(id=7).first().full_mark
all = Grade.objects.filter(exam_id=7, value__gte=(f*0.95)).order_by('-value').distinct()
p = Paginator(all, 12)
for i in p.page(1).object_list:
...     print(i.id)

Кстати, ваш код завершится аварийно, если объект экзамена с кодом id=7 не будет найден. Вы должны присвоить значение full_mark вашей переменной f условно.

Вернуться на верх