Как ранжировать студентов на основе общих очков в Django Queryset при фильтрации результатовPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как ранжировать студентов на основе общих очков в Django Queryset при фильтрации результатов

Сообщение Anonymous »

Я работаю над приложением Django, где мне нужно ранжировать студентов на основе их общих очков, а затем отфильтровать результаты. Я хочу ранжировать всех студентов на основе их общих очков, но показывать только студентов, которые являются детьми конкретного пользователя (руководителя).

Код: Выделить всё

class StudentQuerySet(SetFieldQuerySetMixin, models.QuerySet):
"""QuerySet for Student model"""

def with_points(self) -> Self:
"""Adds a field indicating total points of a student."""
return self.annotate(
total_points=Coalesce(
models.Sum("attendances__feedback__overall"), Value(0)
)
)

def with_rank(self) -> Self:
"""Adds a field indicating rank of a student."""
self = self.with_points()

return self.annotate(
rank=models.Window(
expression=models.functions.Rank(),
order_by=models.F("total_points").desc(),
)
)

< /code>
class StudentLeaderboardMeListView(generics.ListAPIView):
serializer_class = StudentLeaderboardSerializer
permission_classes = [IsSupervisor]
filter_backends = (DjangoFilterBackend,)
filterset_class = StudentFilter

def get_queryset(self):
all_students = Student.objects.all().with_rank()
top_3_ids = all_students.order_by("rank")[:3].values_list(
"id", flat=True
)
queryset = all_students.exclude(id__in=top_3_ids).filter(
parent=self.request.user
)
queryset = self.filter_queryset(queryset)
return queryset

def list(self, request, *args, **kwargs):
queryset = self.get_queryset()

page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)

serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
Код правильно оценивает всех учащихся на основе их общих очков, но на рейтинг влияет последующая фильтрация (Exculide (id__in = top_3_ids) .filter (parent = self.request.user)) . Мне нужно убедиться, что рейтинг вычисляется на основе всех студентов перед применением фильтра. По сути, рейтинг не должен изменяться на основе отфильтрованных результатов. Мне нужно рассчитывать rank на основе всех студентов, но все же я могу отфильтровать и отображать студентов, которые являются детьми зарегистрированного руководителя.


Подробнее здесь: https://stackoverflow.com/questions/788 ... tering-res
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»