python - Django,使用聚合进行随机记录的快速方法

标签 python django django-queryset

所以我有以下查询:

Person.objects.annotate(film_count=Count('film')).filter(film_count__gte=3).order_by('?')[0]

这会随机拉出一个拥有 3 部电影或更多电影的人。但是,如 django 文档 ( https://docs.djangoproject.com/en/dev/ref/models/querysets/#order-by-fields ) 中所述,这种使用 ('?') 的方法非常慢,我计划让用户经常使用此查询。

我想一种方法是获取该查询的完整列表生成的所有主键,然后将其存储在一个 txt 文件中,每次随机选择一个。但我想知道是否有更优雅的解决方案?

我想另一种方法是:

Person.objects.annotate(film_count=Count('film')).filter(film_count__gte=3).get(pk=randint(1,num_persons))

其中 num_persons 是我数据库中的人数,如果该人与查询不匹配并抛出 DoesNotExist 错误,我只需再次运行它。

最佳答案

您可以使用最简单的解决方案:计算行数并随机选择一个:

queryset = Person.objects.annotate(film_count=Count('film')).filter(film_count__gte=3)
count = queryset.count()
result = queryset[random.randint(count)]

但是请注意,如果在代码段的第 2 行和第 3 行之前删除了某些行,则此方法可能会失败(因此您可以将最后一行包装在 try-catch 中并重试)

关于python - Django,使用聚合进行随机记录的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19464957/

相关文章:

mysql - Django 一对多查询

python - 如何诊断Apache2.4服务错误7024 Incorrect function

python - 从url读取csv并通过pandas将其推送到数据库中

python - Kivy 函数调用中出现意外类型错误

javascript - 使用 TypeScript 的 Django Compressor

python - Django 获取查询集中的范围

子进程中模块的Python调用函数

python - 编写了一个从现有插件创建 Django-CMS 插件的命令

python - Modpython 和虚拟环境

python - Django 对 3 个相关表的查询优化