所以我有以下查询:
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
错误,我只需再次运行它。