zoukankan      html  css  js  c++  java
  • Django Models随机获取指定数量数据方法

    方法一:新增models的Manager方法

    下面就直接发代码了

    class RandomManager(models.Manager):
        def get_queryset(self):
            return super(RandomManager, self).get_queryset().order_by('?')
    

    使用的时候

    class TrainWord(models.Model):
        '''
        User train word
        '''
        word = models.CharField(max_length=32)
     
        randoms = RandomManager()
     
        def __unicode__(self):
            return self.word
    

    数据展示时:

    words = TrainWord.randoms.all()[count]
    

    这种方式,是自己定义了一个Models的manager方法,任何一个models都可以使用此方法,具有通用性。

    方法二:查询数据时,通过order_by('?')实现

    实现代码:

    Content.objects.all().order_by('?')[:100]
    

    我们可以看到这段代码就是方法一中重写Models的Manager的核心代码,都是通过models的order_by('?')来实现随机获取数据中的数据,在通过切片,实现获得指定大小的数据内容。

    注意:

    以上两种方法都存在性能瓶颈,当数据库中的数据足够大的时候,就会响应特别慢。

    方案三:通过随机数,来获取随机的数据

    代码:

    import random
    last = MyModel.objects.count() - 1
    
    index1 = random.randint(0, last)
    index2 = random.randint(0, last - 1)
    if index2 == index1: index2 = last
    
    MyObj1 = MyModel.objects.all()[index1]
    MyObj2 = MyModel.objects.all()[index2]
    

    具体的解释,可以看看此篇文章对于order_by('?')的讲解:https://stackoverflow.com/questions/1731346/how-to-get-two-random-records-with-django/6405601#6405601

    本文首发于BigYoung小站

  • 相关阅读:
    nginx 相关命令
    uni-app跨域解决
    vue-cli3.0的项目搭建
    vue.js
    Flex布局
    javascript 数组排重
    IE的hack问题浅谈
    div自身高度、屏幕高度
    bootstrap轮播和百叶窗
    面向对象
  • 原文地址:https://www.cnblogs.com/bigyoung/p/13366830.html
Copyright © 2011-2022 走看看