如何解决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)
...
现在我需要针对以下条件过滤查询集:
- 分数超过GradeAthreshold的考试结果列表
- 分数小于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级结果进行过滤?。
解决方法
正如您提到的,ExamSetting
和ExamResult
都有相同的字段;假设数据具有适当的完整性,则可以基于其中之一进行数据透视。
例如,如果您希望所有类似课程的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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。