所以我有以下问题:
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
错误,我只需再次运行它。
答案 0 :(得分:1)
您可以使用最简单的解决方案:计算行并随机选择一行:
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中将最后一行包装并重试)
答案 1 :(得分:0)
就像我在帖子中编辑的那样,我可以这样做:
Person.objects.annotate(film_count=Count('film')).filter(film_count__gte=3).get(pk=randint(1,num_persons))
在try / except块中,如果记录不存在,只需使用不同的随机数重试。
答案 2 :(得分:0)
如果在ORM中指定随机运算符我很确定它会给你两个截然不同的随机结果吗?
MyModel.objects.order_by('?')[:2] # 2 random results.
Note: order_by('?') queries may be expensive and slow, depending on the database backend you’re using.