Question

J'extraire les dernières 5 lignes d'un modèle Foo qui est commandé par un champ datetime.

qs = Foo.objects.all()[:5]

Dans l'étape suivante, je veux réorganiser la queryset par d'autres critères (en fait, par le même champ datetime dans le sens inverse). Mais après réordonnancement une tranche est pas autorisée. inverse () annule la première commande, me donnant un queryset de differet. Est-il possible d'accomplir ce que je veux sans créer une liste de la queryset et de faire la commande à l'utiliser?

Était-ce utile?

La solution

Non, il n'y a aucun moyen de le faire. order_by est une opération sur la base de données, mais lorsque vous découpez un queryset il est évalué et ne va pas revenir à la base de données après.

On dirait que vous connaissez déjà la solution, bien que:. reversed() course sur les qs évalués

qs = reversed(Foo.objects.all()[:5])

Autres conseils

order_by vous donne la commande SQL dans la base de données. Vous utilisez déjà que, puis trancher là-dessus. À ce moment-là, les résultats sont récupérés dans la mémoire. Si vous voulez changer l'ordre, vous devez utiliser en mémoire Python tri pour le faire, pas le tri ORM dans la base de données.

Dans votre cas, Daniel a déjà donné la meilleure solution: puisque vous voulez simplement faire un tri selon le même domaine, mais dans l'autre ordre, juste inverser la liste que vous avez:

qs = Foo.objects.all()[:5]
objs = reversed(qs)

Si vous aviez voulu trier par un autre domaine, alors vous utilisez la fonction triée () avec une fonction clé personnalisée:

qs = Foo.objects.all()[:5]
objs = sorted(qs, key=lambda o: o.some_other_field)

réponse tardive, mais cela a fonctionné pour moi juste:

import random
sorted(queryset[:10], key=lambda x: random.random())
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top