[英]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%'
请记住,这会将答案作为字符串而不是int
或float
返回
要在您的get_percentage
中使用它,需要解决一些问题:
studName
未定义或传递到方法中,但在过滤器查询中使用。 这将导致NameError
。sum
注释。要在 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.