“将这两个查询合并为一个查询,按日期排序,并分页?”
这就是 SQL 联合。离开 Django ORM 并使用 SQL 联合。它的速度并不快,因为 SQL 必须创建一个临时结果,并对其进行排序。
创建可以排序的临时结果。由于列表具有排序方法,因此您必须将两个结果合并到一个列表中。
编写一个接受两个查询集的合并算法,对结果进行分页。
编辑。这是一个合并算法。
def merge( qs1, qs2 ):
iqs1= iter(qs1)
iqs2= iter(qs2)
k1= iqs1.next()
k2= iqs2.next()
k1_data, k2_data = True, True
while k1_data or k2_data:
if not k2_data:
yield k1
try:
k1= iqs1.next()
except StopIteration:
k1_data= False
elif not k1_data:
yield k2
try:
k2= iqs2.next()
except StopIteration:
k2_data= False
elif k1.key <= k2.key:
yield k1
try:
k1= iqs1.next()
except StopIteration:
k1_data= False
elif k2.key < k1.key: # or define __cmp__.
yield k2
try:
k2= iqs2.next()
except StopIteration:
k2_data= False
else:
raise Exception( "Wow..." )
您可以折叠分页:
def paginate( qs1, qs2, start=0, size=20 ):
count= 0
for row in merge( qs1, qs2 ):
if start <= count < start+size:
yield row
count += 1
if count == start+size:
break