1

我必须找到两个字段之和高于给定字段的参与者数量。以下型号:

class Examination(models.Model):
    total_score = models.FloatField(_('Total score'), blank=False, null=False, default=60)

class ExamParticipation(models.Model):
    examination = models.ForeignKey(Examination, blank=False, null=False, on_delete=models.CASCADE, related_name='examination_participations')
    total_score = models.DecimalField(_('examination score'), max_digits=3, decimal_places=1, default=0)
    additional_score = models.DecimalField(_('additional score'), max_digits=3, decimal_places=1, default=0)

因此,对于给定的考试,我必须计算有多少参与者,其中 total_score 和 additional_core 的总和大于或等于 total_score/2。这对于查询集是否可行,还是我必须遍历结果?

我尝试了以下查询:

    def count_sufficient_participations(self):
        qs = self.values('examination_participations').order_by('examination_participations').annotate(
        ts=Sum(F('examination_participations__total_score') + F('examination_participations__additional_score'))
    ).annotate(cnt_suff=Count('examination_participations')).filter(ts__gte=30)

但似乎不起作用,我不知道如何用考试中的字段 total_score 替换 30。我想为我的模板设置像 Exam.cnt_suff 这样的东西。任何帮助将不胜感激。

4

2 回答 2

1

Sum是一个aggregate函数,它意味着保持与查询匹配的列的所有值。

但是您想对当前行的第 2 列求和。

所以使用

ts = F('examination_participations__total_score') + F('examination_participations__additional_score')

代替

ts = Sum(F('examination_participations__total_score') + F('examination_participations__additional_score'))
于 2021-05-05T10:54:37.350 回答
0

我找到了以下解决方案:

def count_sufficient_participations(self):
    qs = self.annotate(
        cnt_suff=Count('examination_participations', filter=Q(total_score__lte=(F('examination_participations__total_score') + F('examination_participations__additional_score')) * 2))
    )
    return qs

谢谢你的帮助。

于 2021-05-05T13:45:19.560 回答