「これらの 2 つのクエリを 1 つのクエリに結合し、日付で並べ替えて、ページ番号を付けますか?」
それが SQL ユニオンです。Django ORM を離れて、SQL ユニオンを使用します。SQL はソートする一時的な結果を作成する必要があるため、それほど高速ではありません。
ソート可能な一時的な結果を作成します。リストにはソート方法があるため、2 つの結果を 1 つのリストにマージする必要があります。
結果をページ分割して、2 つのクエリ セットを受け入れるマージ アルゴリズムを作成します。
編集。これがマージアルゴリズムです。
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