Вы можете использовать мини-язык форматирования, чтобы выразить процент в строке
>>> attendence = 20
>>> total = 100
>>> '{:%}'.format(attendence/total)
'20%'
Имейте в виду, что ответ будет возвращаться в виде строки вместо int
или float
Чтобы использовать это в get_percentage
, необходимо решить несколько проблем:
studName
не определено или не передано в метод, но используется в фильтрезапрос.Это приведет к NameError
. - Ваш запрос фильтра выглядит так, будто он просто считает студентов в запросе фильтра, а не суммирует посещаемость.Вы должны использовать аннотацию
sum
, как вы делали в представлении. - Вы должны будете иметь возможность получить значение для 100% посещаемости, чтобы можно было разделить его.
Чтобы изменить свое значение этой модели на модели, вы можете сделать что-то вроде этого.
def get_percentage(self):
student = MarkAtt.objects.filter(studName=self.studName).annotate(mark=Sum('attendance'))
return '{:%}'.format(student.mark / 1100)
Однако я не думаю, что модель MarkAtt
является подходящим местом для этого, как многие MarkAtt
объектов могут относиться к одному NameList
объектам, что может привести к выполнению одного и того же запроса несколько раз для каждого учащегося.Я думаю, что было бы лучше сделать это на NameList
или самом представлении.
class NameList(models.Model):
...
def get_percentage(self):
attendance = self.markatt_set().annotate(total=Sum('attendance'))
return '{:%}'.format(attendance.total / 1100)