我从两个模型中查询:
fq = MyModel.objects.order_by('-added_time')
sq = MySecondModel.objects.order_by('-added_time')
说,查询集是:
1_1, 1_2, 1_3
2_1, 2_2, 2_3
我想:
1_1, 2_1, 1_2, 2_2, 1_3, 2_3
我尝试的是:
all_res = list(fq) + list(sq)
但它正在提供1_1, 1_2, 1_3, 2_1, 2_2, 2_3
我该怎么做才能达到我的目的?我使用的是paginator
,因此结果也应该是一个查询集。
修改:
这就是我现在正在做的事情:
fq= MyModel.objects.order_by('-added_time')
sq = MySecondModel.objects.order_by('-added_time')
all_res = sorted(chain(fq, sq),key=attrgetter('-added_time'))
我有这种类型的分页,我在页面中设置左右边距。
这个左右距离我设置如下:
min = all_res.number - 5
max = all_res.number + 5
这一行给了我错误:'list' object has no attribute 'number'
,因为all_res
是一个列表。
答案 0 :(得分:3)
你想对它们进行排序,还是想要交织它们?如果是前者,
all_res = sorted(list(fq) + list(sq), key = lambda x: (x[-1], x[0]))
答案 1 :(得分:1)
您可以使用heapq's merge(合并多个已排序的iterables):
In [11]: a = [1, 4, 6]
In [12]: b = [2, 3, 7]
In [13]: list(heapq.merge(a, b))
Out[13]: [1, 2, 3, 4, 6, 7]
答案 2 :(得分:0)
现有代码:
fq = MyModel.objects.order_by('-added_time')
sq = MySecondModel.objects.order_by('-added_time')
1_1, 1_2, 1_3
2_1, 2_2, 2_3
你想:
1_1, 2_1, 1_2, 2_2, 1_3, 2_3
如果您知道所需的顺序是fq [n],sq [n],fq [n + 1] ......等,那么解决方案非常简单。如果您不确定对象是否会以该模式出现(缺少数据?),那么我建议将列表和排序组合起来。
answer = [f for s in zip(fq, sq) for f in s]