首页 > 解决方案 > order_by 基于条件

问题描述

我有一个分配模块的查询集。我想根据自定义条件订购查询集。

我的观点:

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”都有一个completion_status。“AssignmentModule”有一个截止日期 DateTimeField 字段。我想按此顺序订购查询集。未提交且截止日期已过的作业将过期,这些作业应排在第一位。未提交的作业应按截止日期顺序排列,最早的应该在前。UserEnrolment completion_status 为 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)

module 为作业,当完成状态为 2 时,作业已提交,完成状态 None 为作业未提交

标签: djangodjango-modelsdjango-querysetdjango-filter

解决方案


推荐阅读