views:

175

answers:

1

Hello,

For one of my clients, I am generating a clients list from the Django Admin. It splits the clients by status: current, acquired, and past.

Currently, the view code for that list is as follows:

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
})

Now, I know this isn't ideal as it hits the database three times when I'm pretty sure there's a way to do it with only one query. Is it possible to refactor this code so that it only hits the database once and uses Python to split the result into those three variables? Or am I just stressing too much over a trivial part of my application?

Thanks,

Matt

+1  A: 

Unless you've profiled your app and know this is a serious bottleneck, I think you've got the answer: "just stressing too much".

You could fetch your data in a single ORM statement using Q objects...

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

...but then you'd have all three statuses in one queryset, and probably wouldn't have ten of each, and you'd still have to separate them for your template.

pbx
+1 Because of the limits set in the original query, I think that "stressing to much" is the correct answer.
Tom Leys
Thanks (I'd vote it up but I don't have enough rep). Since it's a small site, I don't think it'll be a big bottleneck.
mjaz