2010-11-14 4 views
0

Travailler sur un projet avec un autre. Ceci est un code que j'ai écrit dans view.py pour trier un QuerySet basé sur certaines données de formulaire:Méthode la plus efficace pour trier un QuerySet Django basé sur une valeur de formulaire

# Get sort by value 
sort_by = search_form.cleaned_data.get('sort_by', SORT_BY_LAST_VISIT) 

# Gather stops 
stops = Stops.approved_objects.filter(**query_attributes) 

# Do neccessary sorting 
if sort_by == SORT_BY_PRICE: 
    stops = stops.order_by('price') 
else: # By default, sort by last visted 
    stops = stops.order_by('last_visited') 

Cependant, hier soir, mon collègue modifié le code à ceci:

# Get sort by value 
sort_by = search_form.cleaned_data.get('sort_by', SORT_BY_LAST_VISIT) 

# Gather stops based on sort 
if sort_by == SORT_BY_PRICE: 
    stops = Stops.approved_objects.filter(**query_attributes).order_by('price') 
else: # By default, sort by last visted 
    stops = Stops.approved_objects.filter(**query_attributes).order_by('last_visited') 

Son commentaire SVN: More efficient.

Selon Django's documentation, les deux équivaudront à une requête de base de données. Il est possible que je manque quelque chose d'autre. Peut-être le fait que je mets la variable s'arrête (stops = ...) deux fois? Parce que je ne peux pas le contacter avant lundi, je pense que je vais aller à la communauté SO sur celui-ci.

Répondre

1

Optimisation inutile. En outre:

# settings.py 
SORTS = {SORT_BY_PRICE: 'price'} 
DEFAULT_SORT = 'last_visited' 

# whatever.py 
sort_field = settings.SORTS.get(sort_by, settings.DEFAULT_SORT) 

stops = Stops.approved_objects.filter(**query_attributes).order_by(sort_field) 

C'est ce que vous devez faire;)

+0

+1 pour améliorer quelque chose que je ne savais pas d'amélioration nécessaire. Comme toujours, beaucoup obligé @Ignacio. –

1

solution de votre collègue ne devrait enregistrer une STORE_FAST instruction (en supposant que ce soit dans une fonction Si elle est globale que c'est un STORE_GLOBAL) et un LOAD_FAST. (ou instruction LOAD_GLOBAL). Je suis assez militant sur la transpiration des microsecondes (quand je sais comment), mais pas au prix de la lisibilité. Votre version est beaucoup plus lisible.

Bien que, je le ferais

sort_field = 'price' if sort_by == SORT_BY_PRICE else 'last_visited' 
stops = Stops.approved_objects.filter(**query_attributes).order_by(sort_field)` 
+0

Oui, il s'agit d'une fonction view.py. Son code me crie pré-optimisation et, dans mon opinion biaisée, est moins lisible. J'aime votre version (+1) mais nous ajouterons plus de valeurs SORT_BY_ * dans un futur proche. Je suppose que vous ne suivrez pas la même approche, n'est-ce pas? –

+0

@Nimmy Absolument correct. Avec plus de deux valeurs, Ignacio's est absolument la bonne. Pour seulement deux valeurs, la mienne est (je pense) aussi lisible et plus rapide selon la façon dont '==' est implémenté. Pour plus, son sera meilleur. – aaronasterling

Questions connexes