如何使用Django的ORM提取随机记录?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (13)

我有一个模型,代表我在我的网站上呈现的绘画。在主网页上,我想展示其中一些:最新的,一个大部分时间没有被访问,最受欢迎的和随机的。

我用的是Django 1.0.2。

虽然使用Django模型可以很容易地拉出前3个模型,但最后一个(随机)会给我带来一些麻烦。在我看来,我可以将其编码如下:

number_of_records = models.Painting.objects.count()
random_index = int(random.random()*number_of_records)+1
random_paint = models.Painting.get(pk = random_index)

在我看来,这看起来不像是我想要的东西--这完全是数据库抽象的一部分,应该在模型中。此外,这里我需要处理删除的记录(然后所有记录的数量将不涵盖所有可能的键值),可能还有很多其他的事情。

还有其他的选择,最好是在模型抽象中,我可以这样做吗?

提问于
用户回答回答于

使用order_by('?')将在生产的第二天结束db服务器。

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]
用户回答回答于

只需使用:

MyModel.objects.order_by('?').first()

它被记录在QuerySet API...

扫码关注云+社区