2009-07-13 6 views
0

Pour l'un de mes clients, je génère une liste de clients depuis l'Admin Django. Il divise les clients par statut: actuel, acquis et passé.Question Django et SQL: Réduire le nombre d'accès à la base de données

Actuellement, le code de la vue de cette liste est la suivante:

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

Maintenant, je sais que ce n'est pas idéal car il frappe trois fois la base de données quand je suis sûr qu'il ya une façon de le faire avec une seule requête. Est-il possible de refactoriser ce code pour qu'il ne frappe qu'une seule fois la base de données et utilise Python pour diviser le résultat en ces trois variables? Ou est-ce que je ne fais que trop insister sur une partie insignifiante de ma candidature?

Merci,

Matt

+1

Est-ce lent? Sinon, allez-y et optimisez ailleurs. – ebo

Répondre

2

Sauf si vous avez PROFILES votre application et de savoir c'est un goulot d'étranglement sérieux, je pense que vous avez la réponse: « tout en insistant trop ».

Vous pourrait chercher vos données dans une seule instruction ORM utilisant Q objects ...

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

... mais vous auriez tous les trois statuts dans un queryset, et aurait probablement pas dix de chaque, et vous devrez toujours les séparer pour votre modèle.

+0

+1 En raison des limites définies dans la requête d'origine, je pense que "stresser beaucoup" est la bonne réponse. –

+0

Merci (je voterais mais je n'ai pas assez de rep). Comme c'est un petit site, je ne pense pas que ce soit un gros goulot d'étranglement. – mjaz

Questions connexes