Django оптимизирует код для фильтрации больших данных - PullRequest
0 голосов
/ 24 января 2012

При поиске результатов 15000, есть ли способ оптимизировать скорость обработки?

В моем просмотре я фильтрую поиск следующим образом:

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 в этом случае?

Ответы [ 2 ]

0 голосов
/ 24 января 2012

Это не ответ, а всего лишь совет, облегчающий чтение и работу с кодом:

  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 голосов
/ 24 января 2012

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

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

...