Nips
Nips

Reputation: 13870

How to mix queryset results?

I have query:

items = MyModel.objects.all().order_by('nr')[:10]

and I get 10 items with higher number. Now I have to mix these results. How to do it?

Upvotes: 20

Views: 10323

Answers (3)

AndyTheEntity
AndyTheEntity

Reputation: 4136

Curiously, this not very well documented feature works:

Country.objects.order_by('?')

source: http://www.jpstacey.info/blog/2008/09/03/random-ordering-of-query-results-in-django

Astonishingly, the existing documentation has very little Google juice, unless you search for "randomly" rather than "random".

Upvotes: 33

moopet
moopet

Reputation: 6185

OK, you can't re-order a queryset after you've pulled it in, but you can do this instead

import random
items = list(MyModel.objects.all().order_by('nr')[:10])
random.shuffle(items)

Upvotes: 19

Sergey Lyapustin
Sergey Lyapustin

Reputation: 1937

You can't reorder a query once a slice has been taken, so use different approach

import random
items = sorted(MyModel.objects.all().order_by('nr')[:10], key=lambda x: random.random())

Upvotes: 21

Related Questions