Я искал лучший способ использовать аннотацию подзапроса и Avg, но не мог его понять. Это то, что у меня есть на данный момент, и это работает, давая мне среднее количество сотрудников на компанию, но это уродливо.

companies = Company.objects.all()
for company in companies:
    salary = []
    for emp in company.comp_emp.all():
        salary.append(emp.salary)
    print(sum(salary) / len(salary))

>>> 99054.4
>>> 96403.75
>>> 498351.375

Я попробовал следующее, но не пошел,

companies = Employee.objects.filter(company=OuterRef('pk'))
employee_count = Company.objects.annotate(avg_emp_salary=Avg(Subquery(companies.values('salary')[:])))

>>> 46907.0
>>> 147288.0
>>> 43158.0

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

Заранее спасибо.

-1
Linus 21 Апр 2020 в 09:59

1 ответ

Лучший ответ

Я думаю, что использование подзапроса здесь излишне. Для этого можно использовать более простой синтаксис.

companies = Company.objects.annotate(avg_emp_salary=Avg('employee__salary'))
0
Johan Schiff 21 Апр 2020 в 07:44