如何使用Django的ORM拉一个随机记录?

问题:

我有一个模型,代表我在我的网站上出现的绘画。在主要网页上,我想展示其中的一些:最新的,大多数时间没有访问的,最受欢迎的和随机的。
我使用的是Django 1.0.2。
虽然前3个人很容易使用django模型,最后一个(随机)导致我一些麻烦。我可以在我的看法中编写代码,就像这样:

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('?')将在生产的第二天杀死数据库服务器。一个更好的方法就像Getting a random row from a relational database中描述的

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]

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: How to pull a random record using Django’s ORM?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

17 − 15 =