我有一个清单:
destinations = test_task.destination_list()
- 这是一个字符串列表,包含分配给当前test_task对象的国家/地区名称。
我的表格 CDR 包含字段:
id(pk)
number(charfield)
area(charfield).
我需要从CDR表中选择3个随机数,其中area =目的地为每个目的地。
我可以只使用一个选择吗? 或者我是否需要为每个目的地制作一个循环? 哪种方法正确?
答案 0 :(得分:0)
正如我在评论中提到的,我认为单一查询没有可行的方法。 如果您使用循环,则可以将random ordering,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 * docs中记录的此查询可能很慢,如果目标数量很高,可能会变得更慢。
答案 1 :(得分:0)
简单的方法是确保通过rand()按每个目的地顺序进行循环和查询,并限制为3。 如果您不想这样做并且您想要执行单个查询,则mysql无法通过使用单个查询为每行返回3个结果。您有义务要求完整的返回并使用逻辑来减少代码中的结果数量。您可以运行查询,例如“SELECT * FROM CDR WHERE IN(?,?...)ORDER BY RAND(),并循环到结果,直到每种类型有3行。
如果您的目标数组不是太大,我建议循环到目标并查询每个目的地,而不是选择所有可能的结果并使用代码循环到它。