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
условно.