Django как рассчитать процент с использованием аннотации? - PullRequest
0 голосов
/ 28 февраля 2020

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

это мои views.py

from django.db.models import F
gradepercategory = studentsEnrolledSubjectsGrade.objects.filter(grading_Period = period).filter(Subjects = subject).filter\
        (Grading_Categories__in = cate.values_list('id')).values('Grading_Categories').annotate( average_grade = Avg * F('Grading_Categories__PercentageWeight') / 100)

это мои models.py

class gradingCategories(models.Model):
    CategoryName = models.CharField(max_length=500, null=True)
    PercentageWeight = models.FloatField()


class studentsEnrolledSubjectsGrade(models.Model):
    GradeLevel = models.ForeignKey(EducationLevel, related_name='grade', on_delete=models.CASCADE,
                                   null=True, blank=True)
    Subjects = models.ForeignKey(Subject, related_name='subject', on_delete=models.CASCADE, null=True)
    Students_Enrollment_Records = models.ForeignKey(StudentsEnrolledSubject, related_name='student',
                                                    on_delete=models.CASCADE, null=True)
    Grading_Categories = models.ForeignKey(gradingCategories, related_name='category', on_delete=models.CASCADE,
                                           null=True, blank=True)
    grading_Period = models.ForeignKey(gradingPeriod, related_name='period', on_delete=models.CASCADE,
                                       null=True, blank=True)
    _dates  = models.CharField(max_length=255,null=True, blank=True)
    Grade = models.FloatField(null=True, blank=True)

Для получения дополнительной информации:

Например, среднее значение Викторины (категории оценки) равно 80, и оно умножится на 15 (PercentageWeight)

Всего = 80 (Grading_Categories) * 15 (PercentageWeight) total = total / 100

Результат должен быть 12

1 Ответ

0 голосов
/ 28 февраля 2020

Вы можете сделать это, используя F Expresisons

Из документов:

Reporter.objects.all().update(stories_filed=F('stories_filed') + 1)

Так что ваш пример будет выглядеть примерно так:

studentsEnrolledSubjectsGrade.objects.all().annotate(grade_percent=(.8 * F('Grading_Categories')) * (.15 * F('PercentageWeight') / 100)

(в качестве примечания: стандарты django / python используют UpperCaseCamelCase для имен классов и snake_case для имен полей. Поэтому StudentsEnrolledSubjectsGrade и grading_categories) ознакомьтесь с Pep-8 для получения подробной информации)

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