Django Models隨機獲取指定數量資料方法

renke發表於2021-09-09

方法一:新增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(’?’)的講解:

本文首發於

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/430/viewspace-2825920/,如需轉載,請註明出處,否則將追究法律責任。

相關文章