Как произвести сумму полей в Django?
Эксперт (Expert) заполняет Опросный лист (Blank_list) с выбранным Сотрудником (Employee) и выставляет оценки(lvl1, lvl2, lvl3).
Будет несколько Экспертов, соответственно будет 5 Опросных листов с Оценками.
Для подведения итогов была создана модель EmployeeCard, чтобы собрать сумму всех оценок и вывести среднюю для определенного Сотрудника.
Как суммировать оценки с Опросных листов?
models.py:
ANSWER_TYPES = (
(0, 0),
(1, 1),
)
class Expert(models.Model):
expertname = models.CharField(max_length=200, null=True)
position = models.CharField(max_length=200, null=True)
class Employee(models.Model):
employeename = models.CharField(max_length=200, null=True)
position = models.CharField(max_length=200, null=True)
class Blank_list(models.Model):
expert_name = models.ForeignKey(Expert, null=True, on_delete=models.SET_NULL)
employee_name = models.ForeignKey(Employee, null=True, on_delete=models.SET_NULL)
lvl_1 = models.IntegerField('Indicator1:1', choices=ANSWER_TYPES, blank=0)
lvl_2 = models.IntegerField('Indicator1:2', choices=ANSWER_TYPES, blank=0)
lvl_3 = models.IntegerField('Indicator1:3', choices=ANSWER_TYPES, blank=0)
class EmployeeCard(models.Model):
blank_list = models.ManyToManyField(Blank_list, null=True, ) #несколько опросных листов привязанных к работнику
#но я не уверен, что я правильно определил blank_list как модель с ManyToManyField
employee_name = models.ForeignKey(Employee, null=True, on_delete=models.SET_NULL)
sum_of_all_blank_list = ...
Ответы (1 шт):
на мой взгляд ты зря добавил модель EmployeeCard у тебя уже есть привязка Blank_list и Employee и дополнительная не особо нужна.
Для того, что бы было проще обращаться к бланк листам из модели Employee я бы немного изменил описание employee_name на employee_name = models.ForeignKey(Employee, null=True, on_delete=models.SET_NULL, related_name="blank_list") да и название поля employee_name сменил бы на employee
для нахождения суммы и среднего значения можно использовать аннотации https://docs.djangoproject.com/en/3.0/topics/db/aggregation/
from django.db.models import Avg, Sum
employee_rating_list = Employee.objects.annotate(avg_lvl_1=Avg('blank_list__lvl_1'), avg_lvl_2=Avg('blank_list__lvl_2'), avg_lvl_3=Avg('blank_list__lvl_3'))
for employee in employee_rating_list :
print(employee.employeename, employee.avg_lvl_1, employee.avg_lvl_2, employee.avg_lvl_3)
аналогично и с суммой