Django で複数の QuerySet を結合する: 包括的なソリューション
Django サイトで複数のモデルを検索する場合、それらのクエリセットを結合する必要がある場合があります。それぞれの QuerySet を使用して、検索結果のページネーションを有効にします。 QuerySet には組み込みのマージ関数がないため、これには課題が生じる可能性があります。
手動リスト連結
1 つの方法では、QuerySet を手動でリストに連結します。 loop:
result_list = [] page_list = Page.objects.filter( # Filter logic for Page model ) article_list = Article.objects.filter( # Filter logic for Article model ) post_list = Post.objects.filter( # Filter logic for Post model ) for x in page_list: result_list.append(x) for x in article_list: result_list.append(x) for x in post_list: result_list.append(x)
ただし、この方法は効率的ではなく、次の場合にメモリの問題が発生する可能性があります。大規模なデータセットを処理します。
itertools.chain の使用
より効率的でメモリに優しいアプローチは、Python 標準ライブラリの itertools.chain 関数を使用することです。
from itertools import chain result_list = list(chain(page_list, article_list, post_list))
itertools.chain は、各 QuerySet の要素を反復処理するジェネレーターを作成します。
結合された QuerySet の並べ替え
結合された QuerySet の並べ替えは、sorted(...) と attrgetter を使用すると簡単です。
from operator import attrgetter result_list = sorted( chain(page_list, article_list, post_list), key=attrgetter('date_created') )
attrgetter は、オブジェクト内の各オブジェクトから指定された属性を取得します。 QuerySet。特定のフィールド (date_created など) に基づいて並べ替えが可能です。
さらに、reverse パラメーターを True に設定することで並べ替え順序を逆にすることができます:
result_list = sorted( chain(page_list, article_list, post_list), key=attrgetter('date_created'), reverse=True, )
以上がページネーションのために複数の Django QuerySet を効率的に組み合わせて並べ替えるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。