Django代码以洗牌顺序从queryset,shuffle ID和查询数据库中获取ID

时间:2016-05-08 19:21:09

标签: python mysql django database

我正在尝试在Django中执行以下操作:

  1. 执行数据库查询以返回满足查询的所有记录的ID。
  2. 将查询中的ID列表随机排序。
  3. 创建一个新的查询集,以洗牌顺序从数据库中获取记录。
  4. 因此,如果我的初始数据库查询如下所示:

    queryset = Item.objects.filter(my_field = a_value)
    

    如何从查询中获取ID列表,以便我可以随机播放:

    random.shuffle(list_of_ids_matching_query)
    

    即。我想从查询集中创建list_of_ids_matching_query,但我无法解决如何做到这一点。

    然后我打算按照以下方式进行查询:

    queryset = Item.objects.filter(pk__in=list_of_ids_matching_query)
    

    但我需要查询以与随机列表中的ID相同的顺序返回记录。它会那样做吗?或者我是否必须一次从数据库中提取记录。

    我想要做的是,并且可能有更好的方法来实现这一点,就是从数据库中随机获取一组随机结果。

1 个答案:

答案 0 :(得分:2)

尝试此查询

list_of_ids_matching_query = list(Item.objects.filter(my_field = a_value).values_list('id', flat=True))

以与洗牌列表中的ID相同的顺序获取记录,

ordering = 'FIELD(`id`, %s)' % ','.join(str(id) for id in shuffiled_list)
Item.objects.filter(pk__in=shuffiled_list).extra(select={'ordering': ordering }, order_by=('ordering', ))