django 从指定数据库中指定表随机抽取数据

前端之家收集整理的这篇文章主要介绍了django 从指定数据库中指定表随机抽取数据前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

django 从指定数据库中指定表随机抽取数据

第一种方法:使用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()

第三种方法:利用id索引获取(建议使用)

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

猜你在找的Django相关文章