Django и SQL вопрос: уменьшить количество обращений к базе данных - PullRequest
0 голосов
/ 13 июля 2009

Для одного из моих клиентов я создаю список клиентов от администратора Django. Он разделяет клиентов по статусу: текущий, приобретенный и прошлый.

В настоящее время код представления для этого списка выглядит следующим образом:

def clients_list(request):
current_clients = Client.objects.all().filter(status='current')[:10]
acquired_clients = Client.objects.all().filter(status='acquired')[:10]
past_clients = Client.objects.all().filter(status='past')[:10]

return render_to_response('clients/list.html', {
    'current_clients': current_clients,
    'acquired_clients': acquired_clients,
    'past_clients': past_clients
})

Теперь я знаю, что это не идеально, так как он попадает в базу данных три раза, когда я почти уверен, что есть способ сделать это только одним запросом. Можно ли реорганизовать этот код так, чтобы он попадал в базу данных только один раз и использовал Python для разделения результата на эти три переменные? Или я просто слишком акцентирую внимание на тривиальной части моего приложения?

Спасибо

Мэтт

1 Ответ

2 голосов
/ 14 июля 2009

Если вы не профилировали свое приложение и не знаете, что это серьезное узкое место, я думаю, у вас есть ответ: "просто слишком много стресса".

Вы можете получить данные в одном операторе ORM, используя Q объектов ...

clients = Client.objects.filter(Q(status='current')|Q(status='acquired')|Q(status='past'))[:30]

... но тогда у вас будет все три статуса в одном наборе запросов, и, вероятно, не будет десяти каждого, и вам все равно придется разделить их для вашего шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...