微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐