Рассчитать процент на основе суммы суммы в представлении Джанго - PullRequest
0 голосов
/ 20 сентября 2019

Я бы хотел отобразить процентную отметку вместо общей суммы отметки.Прямо сейчас у меня есть таблица, которая отображает имя студента и его оценку посещаемости.Я хотел бы перевести оценку посещаемости в процент.текущая реализация:

Посещаемость имени студента

Энни 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)

Ответы [ 2 ]

0 голосов
/ 20 сентября 2019

Вы можете использовать мини-язык форматирования, чтобы выразить процент в строке

>>> 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)
0 голосов
/ 20 сентября 2019

Итак, у вас есть числитель, но вам нужен деноменатор.Я не совсем уверен, каким должен быть ваш деноменатор с вашей текущей настройкой, но создание нового поля, которое использует «Count», а не «Sum», может помочь вам.Затем вы должны разделить поле суммы на поле счетчика.Я бы, наверное, просто сделал это в представлении, а не связывался с моделью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...