from django.db import models import random class RandomQueryset(models.query.QuerySet): """Custom queryset""" def randomize(self): """Returns random object from given model without 'shot the foot' ['?'][0]""" count = self.count() random_index = random.randint(0, count - 1) return self.all()[random_index] class RandomManager(models.Manager): """Custom manager, returns RandomQueryset instance. Usable for related objects, required to be defined as default manager.""" use_for_related_fields = True def get_query_set(self): return RandomQueryset(self.model, using=self._db) def randomize(self): return self.get_query_set().randomize() In use: In [1]: from myapp.models import PostPages In [2]: post = PostPages.objects.filter(image_gallery__isnull=False).distinct().randomize() In [3]: post.image_gallery.randomize() Out[3]: