繁体   English   中英

根据 django 视图中的总和值计算百分比

[英]Calculate percentage based on the sum value in the django view

我想显示百分比标记而不是标记的总和。 现在我有一个表格,显示学生姓名和他们的出勤率。 我想将出勤率转换为百分比。 当前的实现是:

学生姓名 考勤

安妮 200

安妮 150

但我想以百分比显示出勤率。 例如:学生姓名出勤

安妮 100%

安妮 85%

我不确定如何实现该方法。 但我试过这个:

# models.py: 

class MarkAtt(models.Model):
    studName = models.ForeignKey(
        Namelist, on_delete=models.SET_NULL, blank=True, null=True, default=None,
    )
    classGrp = models.ForeignKey(GroupInfo, on_delete=models.SET_NULL, null=True)
    currentDate = models.DateField(default=now())
    week = models.IntegerField(default=1)
    attendance = models.IntegerField(default=100) #1 is present

    def get_percentage(self):
        ttlCount = MarkAtt.objects.filter(studName).count()
        perc = ttlCount / 1100 *100
        return perc



# views.py:

def attStudName(request):

    students = MarkAtt.objects.values('studName__VMSAcc').annotate(mark=Sum('attendance'))
    context = {'students' : students}
    return render(request,'show-name.html', context)

所以你有你的分子,但你需要你的分母。 我不确定您当前设置的分母应该是什么,但创建一个使用“计数”而不是“总和”的新字段可能会为您解决问题。 然后,您将 sum 字段除以 count 字段。 我可能只是在视图中执行此操作,而不是弄乱 model。

您可以使用格式化迷你语言来表示字符串中的百分比

>>> attendence = 20
>>> total = 100
>>> '{:%}'.format(attendence/total)
'20%'

请记住,这会将答案作为字符串而不是intfloat返回

要在您的get_percentage中使用它,需要解决一些问题:

  • studName未定义或传递到方法中,但在过滤器查询中使用。 这将导致NameError
  • 您的过滤器查询看起来只是在过滤器查询中计算学生人数,而不是对出勤率求和。 您应该像在视图中那样使用sum注释。
  • 您需要能够获得 100% 出勤率的值才能除以它。

要在 model 上修改您对此的实施,您可以执行以下操作。

    def get_percentage(self):
        student = MarkAtt.objects.filter(studName=self.studName).annotate(mark=Sum('attendance'))
        return '{:%}'.format(student.mark / 1100)

但是,我不认为MarkAtt model 是执行此操作的正确位置,因为许多MarkAtt对象可能与一个NameList object 相关,从而可能导致每个学生多次运行相同的查询。 我认为最好在NameList或视图本身上执行此操作。

class NameList(models.Model):

    ...

    def get_percentage(self):
        attendance = self.markatt_set().annotate(total=Sum('attendance'))
        return '{:%}'.format(attendance.total / 1100)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM