1

I've read this question: In Django, how do I select 100 random records from the database?
And tried to use Content.objects.all().order_by('?')[:30], but this will produce some duplicate items. So how could I select 30 unique random values from database?

1
  • For millions of items: Can you modify your models? Do you need a different order each time? You can create an int index in your model and assign randint(MAXINT) to it. Then order_by('randindex'). Resetting the order is O(n) but doable (every hour/day for example). Commented Jul 30, 2012 at 10:16

1 Answer 1

2

If you have a manageable number of entries in the database (ie not thousands), this will work, and even though it hits the db twice it will probably be much more efficient than order_by('?').

import random
content_pks = Content.objects.values_list('pk', flat=True)
selected_pks = random.sample(content_pks, 30)
content_objects = Content.objects.filter(pk__in=selected_pks)
Sign up to request clarification or add additional context in comments.

3 Comments

Surely selecting thousands of ids should not be a problem. It's only a single column!
Yes, probably should have said "millions".
I tried this and found a problem of it. When you use Content.objects.filter(pk__in=selected_pks), the result will be in the same order as they were in the database. I use random.shuffle() to solve it.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.