2017-08-15 2 views
1

Je suis un peu coincé mentalement à quelque chose, qui semble vraiment simple au premier coup d'œil.Commander un jeu de queues Django basé sur une autre liste avec les ID et les scores

Je suis saisissant une liste de ids pour être sélectionné et scores pour les trier en fonction de.

Ma solution actuelle est la suivante:

ids = [1, 2, 3, 4, 5] 

items = Item.objects.filter(pk__in=ids) 

Maintenant, je dois ajouter un classement en fonction du score en quelque sorte, donc je vais construire la liste suivante:

scores = [ 
     {'id': 1, 'score': 15}, 
     {'id': 2, 'score': 7}, 
     {'id': 3, 'score': 17}, 
     {'id': 4, 'score': 11}, 
     {'id': 5, 'score': 9}, 
    ] 

ids = [score['id'] for score in scores] 

items = Item.objects.filter(pk__in=ids) 

Jusqu'à présent, si bien - mais comment puis-je réellement ajouter les scores comme une sorte d'agrégat et trier le jeu de requête basé sur eux?

Répondre

2

Triez la liste de résultats et récupérez le jeu de requête à l'aide de in_bulk().

scores = [ 
    {'id': 1, 'score': 15}, 
    {'id': 2, 'score': 7}, 
    {'id': 3, 'score': 17}, 
    {'id': 4, 'score': 11}, 
    {'id': 5, 'score': 9}, 
] 
sorted_scores = sorted(scores) # use reverse=True for descending order 
ids = [score['id'] for score in scores] 
items = Item.objects.in_bulk(ids) 

Générez ensuite une liste des éléments dans l'ordre que vous voulez:

items_in_order = [items[x] for x in ids] 
+0

Merci! Très appréciée! Je ai forwent en utilisant 'in_bulk' depuis que j'ai un select_related que je n'ai pas mentionné –