order_by на основе условия - PullRequest
0 голосов
/ 25 мая 2020

У меня есть набор запросов модулей присваивания. Я хочу упорядочить набор запросов на основе пользовательских условий.

Мое представление:

class ListAssignmentsAsStudent(generics.ListAPIView):
    serializer_class = AssignmentModuleSerializer

    def get_queryset(self):
        my_enrolments = UserEnrolment.objects.filter(
            user=self.request.user).values_list('enrolment')
        my_enrolment_enrollables = Enrollable.objects.filter(
            enrolment__in=my_enrolments)
        assignment_modules = []
        for enrollable in my_enrolment_enrollables:
            assignment_modules.extend(enrollable.course_share_item.modules.instance_of(
                AssignmentModule))
        return assignment_modules

Все «UserEnrolment» имеют статус завершения. «AssignmentModule» имеют поле даты выполнения DateTimeField. Я хочу упорядочить набор запросов в этом порядке. Задания, которые не были отправлены и срок выполнения уже истек, будут просрочены, и они должны быть выполнены раньше. Непредставленные задания должны поступать в порядке сроков выполнения, более раннее должно быть первым. Присваивания со статусом завершения UserEnrolment в качестве COMPLETED должны иметь наименьший приоритет. Они будут последними в списке. После заказа задания будут именно в таком порядке.

Overdue>not submitted with due dates earliest first> submitted assignments

Прогресс AssignmentModule поддерживается в модели:

class ModuleProgress(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.ForeignKey(
        ElsUser, on_delete=models.CASCADE, default=None, null=False, blank=False)
    module = models.ForeignKey(
        Module, on_delete=models.CASCADE, default=None, null=False, blank=False)
    completion_status = models.IntegerField(
        default=None, null=True, blank=True)
    progress_percentage = models.IntegerField(
        default=0, null=False, blank=True)
    notes = models.ManyToManyField(ModuleProgressNote)

модуль является назначением, и когда статус завершения равен 2, задание отправлено, состояние завершения Нет - задание не отправлено

...