第一种方法:使用order_by
Article.objects.all().order_by('?')[:10]
这个方法,在数据表中数据量过大时,速度慢,在表数据量过大时,可能会导致线上MysqL崩溃。
django文档:https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by-fields
第二种方法:使用Count
from django.db.models.aggregates import Count from random import randint class PaintingManager(models.Manager): def random(self): count = self.aggregate(count=Count('id'))['count'] random_index = randint(0, count - 1) return self.all()[random_index] class Article(models.Model): objects = UsersManager() # 使用 Article.objects.random()
import random my_ids = Article.objects.values_list('id', flat=True) my_ids = list(my_ids) n = 2 rand_ids = random.sample(my_ids, n) random_records = Article.objects.filter(id__in=rand_ids)
这个方法还是和第一个方法一样弊端,如果表数据量过大,会比较吃资源
第四种方法:
import random max_number =5 article_obj = Article.objects.last() rand_ids = random.sample(range(article_obj.id), max_number * 4) random_articles = Article.objects.filter(id__in=rand_ids).values('id', 'title')[:max_number]
这个方法优于第三种,至于为什么取想要的数量的四倍,是防止部分id被删除,而无法取到数据。
https://stackoverflow.com/questions/962619/how-to-pull-a-random-record-using-djangos-orm