2012-01-24 2 views
0

Как я ищу через 15000 результатов, есть ли способ оптимизировать скорость обработки?Django оптимизировать код для большой фильтрации данных

На мой взгляд, я фильтрации поиска, как это:

if form.is_valid():

 results = Screening.objects.filter(
     screening_date__range(form.cleaned_data['start_date'],form.cleaned_data['end_date'])) 

     if form.cleaned_data['company']: 
      results = results.filter(company=form.cleaned_data['company']) 
     if form.cleaned_data['company_job']: 
      results = results.filter(company_job__in=form.cleaned_data['company_job']) 
     if form.cleaned_data['company_job_type']: 
      results = results.filter(company_job_type=form.cleaned_data['company_job_type']) 
     if form.cleaned_data['reason']: 
      results = results.filter(reason_for_testing__in=form.cleaned_data['reason'])` 

И ШАБЛОН, переданная результат используется как:

{% for result in results %}

 <td>{{ result.company.name}}</td> 
     <td>{{ result.first_name }} {{ result.last_name }}</td> 
     <td>{{ result.company_job.job_number }}</td> 
     <td>{{ result.id }}</td> 
     <td>{{ result.screening_date|date}}</td></tr> 

Есть ли способ оптимизировать обрабатывать или использовать кеш или sth в этом случае?

+0

Что именно ваша проблема? Является ли результирующий запрос слишком медленным? У вас есть индексы правильно? –

+0

База данных попадает только при оценке запроса, так что есть что-то, что я могу сделать для оптимизации моего кода. Я думаю, что есть проблемы с индексами. – Abhaya

ответ

0

Это не ответ, а просто совет, чтобы сделать код более удобным для чтения и работы с:

filters = { 
     'screening_date__range': (form.cleaned_data['start_date'],form.cleaned_data['end_date']) 
    } 

    if form.cleaned_data['company']: 
     filters['company'] = form.cleaned_data['company'] 
    if form.cleaned_data['company_job']: 
     filters['company_job__in'] = form.cleaned_data['company_job'] 
    if form.cleaned_data['company_job_type']: 
     filters['company_job_type'] = form.cleaned_data['company_job_type'] 
    if form.cleaned_data['reason']: 
     filters['reason_for_testing__in'] = form.cleaned_data['reason'] 

    Screening.objects.filter(**filters) 
0

Вы должны обязательно использовать select_related, чтобы сделать ony одним ударом БД (а не N).

Затем прокомментируйте код, найдите узкое место и попытайтесь его оптимизировать, а не «оптимизировать в целом».

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