方法一:新增models的Manager方法 下麵就直接發代碼了 class RandomManager(models.Manager): def get_queryset(self): return super(RandomManager, self).get_queryset().order_b ...
方法一:新增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小站