从数据库中查询一条满足我的过滤查询的记录的最快方法是什么。
mydb.objects.filter(start__gte='2017-1-1', status='yes').order_by('?')[:1]
这个语句会先查询几千条记录,然后再选择一条,而且很慢,但是我只需要一条,随机一条。什么是最快的?
最佳答案
好吧,我不确定您能否完全按照自己的意愿行事。几个月前我遇到了类似的问题,最后我重新设计了我的后端实现以使其正常工作。
本质上,您希望通过选择一条满足这两个要求的随机记录来缩短查询时间 (start__gte='2017-1-1', status='yes'
),但是就像你说的那样,为了让查询这样做,它需要过滤你的整个数据库。这意味着您无法从数据库中获取也满足过滤要求的“真实”随机记录,因为过滤本质上需要查看您的所有记录(否则它不会是真正随机的,它只会是它找到的第一个满足您要求的人)。
相反,考虑将所有具有 status='yes'
的记录放在一个单独的关系中,这样您就可以从那里提取随机记录并加入更大的关系。这将使查询时间大大缩短(这是我为使我的代码正常工作而实现的解决方案类型)。
如果你真的想要一个带有正确过滤信息的随机记录,你可能需要使用一些复杂的方法。
你可以使用 custom manager在 Django 中让它只找到一个随机记录,像这样:
class UsersManager(models.Manager):
def random(self):
count = self.aggregate(count=Count('id'))['count']
random_index = randint(0, count - 1)
return self.all()[random_index]
class User(models.Model):
objects = UsersManager()
#Your fields here (whatever they are, it seems start__gte and status are some)!
objects = UserManager()
然后你可以调用它,只需使用:
User.objects.random()
这可以通过检查您的代码来重复,直到它返回满足您要求的随机记录。我不认为这一定是实现它的最干净或编程上正确的方法,但我认为对于您的特定问题不存在更快的解决方案。
我用了this site作为这个答案的来源,它有更多关于使用这个自定义随机方法的可靠信息!您可能必须更改自定义管理器以满足您自己的需求,但如果您将 random()
方法添加到现有的自定义管理器,它应该能够执行您需要的操作!
希望对您有所帮助!
关于python - Django:使用过滤器随机查询一条记录的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45087192/