Django:基于另一个表中设置的最小最大值的查询集过滤

问题描述

请考虑以下模型:

Class ExamResults:
   ...
   Marks = models.IntegerField(default=0,null=True,blank=True)
   Course = models.CharField(max_length=255,null=True)
   Academic_year = models.CharField(max_length=255,null=True)

Class ExamSetting:
   ...
   GradeAThreshold = models.IntegerField(default=0,blank=True)
   GradeBThreshold = models.IntegerField(default=0,blank=True)
   ...
   Course = models.CharField(max_length=255,null=True)

现在,我有一个API,可以为所有学生从ExamResults中搜索/获取结果。该API工作正常,我使用Q过滤器过滤结果。例如

...
year_contains = self.request.GET.get("year_contains","")
if year_contains:
      q_filt |= Q(Academic_year__icontains=year_contains)
      
queryset = queryset.filter(q_filt)

...

现在我需要针对以下条件过滤查询集:

  1. 分数超过GradeAthreshold的考试结果列表
  2. 分数小于GradeAthreshold且超过GradeBThreshold等的考试结果列表

什么是最好的方法ExamResults表和ExamSetting有两个公共字段,可以缩小阈值。例如我在序列化器中使用以下代码来检查结果是否具有A级:

setting = ExamSetting.objects.filter(Academic_year=obj.Academic_year,Course=obj.Course,is_active=True).first()
if obj.Marks >= setting.GradeAThreshold:
   # Grade A
...

这确实有效,但我确实获得了成绩。现在如何在查询集中添加类似的内容,以便可以对A级或B级结果进行过滤?。

解决方法

正如您提到的,ExamSettingExamResult都有相同的字段;假设数据具有适当的完整性,则可以基于其中之一进行数据透视。

例如,如果您希望所有类似课程的A级或以上成绩都为考试

setting = ExamSetting.objects.filter(
    Academic_year=obj.Academic_year,Course=obj.Course,is_active=True
    ).first()

query = Q(Course=setting.Course) & Q(Mark__gte=setting.GradeAThreshold)
ExamResults.objects.filter(query)