我有一个清单:
destinations = test_task.destination_list()
- 这是一个字符串列表,包含分配给当前 test_task 对象的国家名称。
我有一个带有字段的表CDR :
id(pk)
number(charfield)
area(charfield).
我需要从 CDR 表中选择 3 个随机数,其中每个目的地的 area=destination。
我可以只使用一个选择吗?还是我需要为每个目的地制作一个循环?哪个是正确的方法?
正如我在评论中提到的,我认为没有可行的方法可以通过单个查询来做到这一点。如果您使用循环,您可以将随机排序、values_list和“ in ”运算符组合用于查询集。
final_list = []
for destination in destinations:
final_list += YourCDRModel.objects.filter(area__in=destination).values_list('number', flat=True).order_by('?')[0:3]
请注意,如 *order_by* 文档中所述,此查询可能很慢,如果目的地数量很多,可能会变得更慢。
最简单的方法是确保每个目标按 rand() 排序并限制为 3 进行循环和查询。如果您不想这样做并且想要执行单个查询,mysql 无法返回 3使用单个查询的每行结果。您有义务要求全额退货,并将减少结果数量的逻辑放入我们的代码中。您可以运行诸如“SELECT * FROM CDR WHERE IN (? ,? ...) ORDER BY RAND() 之类的查询,然后循环进入结果,直到每种类型有 3 行。
如果您的目的地数组不是太大,我建议循环进入目的地并查询每个目的地,而不是选择所有可能的结果并使用代码循环进入它。