我必须找到两个字段的总和高于给定字段的参与者数量。以下型号:
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)
但似乎不起作用,我不知道如何将 30 替换为考试中的 total_score 字段。我想为我的模板添加诸如examation.cnt_suff 之类的东西。任何帮助将不胜感激。
答案 0 :(得分: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'))
答案 1 :(得分: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
感谢您的帮助。