2015-03-07 4 views
0

Я работаю на странице, в которой перечислены компании и их сотрудники. Сотрудники имеют продажи. Они сохраняются в базе данных. Теперь мне нужно перечислить их все. Моя проблема в том, что текущее решение выполняется не быстро. Загрузка одной страницы занимает более 15 секунд.Листинг объектов базы данных

В настоящее время я сделал следующее:

companies = {} 
employees = {} 

for company in Company.objects.all(): 
    sales_count = 0 
    sales_sum = 0 

    companies[company.id] = {} 
    companies[company.id]["name"] = company.name 

    for employee in company.employees.all(): 
     employee_sales_count = 0 
     employee_sales_sum = 0 

     employees[employee.id] = {} 
     employees[employee.id]["name"] = employee.first_name + " " + employee.last_name 

     for sale in employee.sales.all(): 
      employee_sales_count+= 1 
      employee_sales_sum += sale.total 

     employees[employee.id]["sales_count"] = employee_sales_count 
     employees[employee.id]["sales_sum"] = employee_sales_sum 

     sales_count += employee_sales_count 
     sales_sum += employee_sales_sum 

    companies[company.id]["sales_count"] = sales_count 
    companies[company.id]["sales_sum"] = sales_sum 

Я новичок в Python, не уверен, если это «вещий» способ делать вещи.

Это 1500 запросов к базе данных со 100 компаниями и некоторыми сотрудниками и продажами для каждого. Как я должен улучшить свою программу, чтобы сделать ее эффективной?

ответ

0

Избегайте вложенности запросов базы данных в циклы - это прекрасный способ исполнения ада! :-)

Поскольку вы рассчитываете все продажи для всех сотрудников, я предлагаю самостоятельно построить своего сотрудника и продавцов. Не забудьте импортировать defaultdict и вы можете для поиска как группы по и Подводя/счетные работает в Django :-)

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

# build employee dict 
employee_qset = Employee.objects.all() 
employees = defaultdict(dict) 
for emp in employee_qset.iterator(): 
    employees[emp.company_id][emp.id] = emp 


# build sales dict 
sales_qset = Sales.objects.all() 
sales = defaultdict(dict) 
for sale in sales_qset.iterator(): 
    # you could do some calculations here, like sum, or better yet do sums via annotate and group_by in the database 
    sales[sale.employee_id][sale.id] = sale 


# get companies 
companies_qset = Companies.objects.all() 
companies = {company.id: company for company in companies_qset.iterator()} 


for company in companies.itervalues(): 
    # assign employees, assign sales, etc. 
    pass 
+0

Спасибо! Что, если я хочу их разбивать на страницы, используя сборку в Paginator? Поскольку мне нужно объединить эти словари, я мог бы просто использовать для этого пагинатор. Но это приведет к загрузке большого количества несвязанных данных. Поэтому, если я хочу показать 15 на страницу, у меня 500 загрузок. – MikkoP

+0

Вы можете загружать и разбивать страницы на страницы до других данных, составлять список с идентификаторами компании и фильтровать Sales and Employees через company__in = id_list – ACimander

+0

Да, теперь они выполняются очень быстро. Но как мне показать данные? Я не могу использовать '{{len (sales [company.id])}}' например, чтобы показать общую сумму заказов для одной компании. Я придумал это: http://pastebin.com/KDyzEUGD – MikkoP

Смежные вопросы