【ITニュース解説】Filtering and Searching Transactions
2025年09月12日に「Dev.to」が公開したITニュース「Filtering and Searching Transactions」について初心者にもわかりやすく解説しています。
ITニュース概要
ウェブアプリで、取引データを日付範囲、カテゴリ、種類で絞り込んだり、メモ内容で検索する機能の実装方法を解説。GETパラメータを使い、Djangoのビューでデータ処理を行い、HTMLテンプレートでフィルタリング・検索フォームを作成する手順を示す。
ITニュース解説
Webアプリケーションにおいて、ユーザーが大量のデータの中から必要な情報だけを効率よく見つけ出す機能は非常に重要である。この機能を実現するのが、データの「フィルタリング」と「検索」である。ここでは、Webサイトに表示される取引(トランザクション)のリストに、日付範囲、カテゴリ、取引タイプによる絞り込みと、メモの内容による検索機能を追加する方法を解説する。
まず、ユーザーがウェブブラウザから入力した検索やフィルターの条件を、どのようにサーバー側のプログラムが受け取るか、という点から説明する。ウェブアプリケーションでは、ユーザーがフォームに入力して送信すると、その情報がサーバーに送られる。特に、今回のようにデータを絞り込む際には、「GETパラメータ」と呼ばれる仕組みがよく使われる。これは、ウェブページのURLの末尾に「?」マークと「キー=値」の形式で情報が付加されるもので、例えば「example.com/transactions?category=1&type=IN」のように表示される。サーバー側のプログラムは、このURLに付加されたGETパラメータを読み取り、それに基づいて処理を行う。
サーバー側、具体的にはDjangoフレームワークのビュー関数では、request.GET.get()という命令を使って、これらのGETパラメータを一つずつ取得する。例えば、request.GET.get('category')と書くことで、URLからcategoryという名前のパラメータが持つ値を取り出すことができる。同様に、transaction_type(取引タイプ)、start_date(開始日)、end_date(終了日)、search(検索キーワード)といったパラメータもそれぞれ取得する。
これらのパラメータが取得できたら、いよいよデータベースからデータを絞り込む処理に入る。最初はすべての取引データを取得するが、取得したGETパラメータが存在する場合にのみ、その条件でさらにデータを絞り込んでいく。例えば、category_idというパラメータがあれば、transactions.filter(category_id=category_id)という形で、そのカテゴリに属する取引だけを抽出する。transaction_typeがあれば、収入(IN)や支出(EX)といった取引タイプで絞り込む。
日付による絞り込みでは、start_dateとend_dateのパラメータを使用する。transactions.filter(date__gte=start_date)は、取引の日付が指定された開始日(start_date)以上であるものだけを選び出す。__gteは「greater than or equal to」(~以上)を意味する。同様に、transactions.filter(date__lte=end_date)は、取引の日付が指定された終了日(end_date)以下であるものを選び出す。__lteは「less than or equal to」(~以下)を意味する。この二つを組み合わせることで、特定の日付範囲内の取引を抽出できる。
さらに、search_queryというパラメータがあれば、取引のメモ(notes)の内容を検索する。transactions.filter(notes__icontains=search_query)という命令は、notesフィールドにsearch_queryで指定された文字列が含まれる取引を抽出する。__icontainsは「case-insensitive contains」(大文字小文字を区別しない部分一致)を意味し、ユーザーが入力したキーワードが、メモのどこかに含まれていればヒットする。これらのfilter()命令は複数回続けて記述することで、AND条件として複数の絞り込み条件を組み合わせることができる。
データの絞り込みが終わったら、その絞り込まれた取引データに基づいて、収入の合計、支出の合計、残高、カテゴリごとの合計といったサマリー情報を再計算する。これにより、ユーザーはフィルターされたデータに合わせた正確なサマリーを確認できる。また、カテゴリ選択用のドロップダウンリストに表示するため、すべてのカテゴリ情報もデータベースから取得しておく。そして、ビュー関数は、フィルター後の取引データ、サマリー情報、そしてユーザーが選択したフィルター条件(選択中のカテゴリID、取引タイプ、開始日、終了日、検索クエリなど)を、すべてHTMLテンプレートに渡す。
次に、ウェブブラウザで表示されるHTMLテンプレート側の処理を説明する。ユーザーがフィルターや検索を行うための入力フォームをHTMLで作成する。このフォームはmethod="get"を指定する。これにより、フォームに入力されたデータはURLのGETパラメータとしてサーバーに送信される。
フォームの中には、カテゴリを選択するためのドロップダウンリスト(<select>タグ)を配置する。このドロップダウンリストの各項目(<option>タグ)は、サーバーから渡されたすべてのカテゴリ情報を使って動的に生成する。ユーザーが前回選択したカテゴリがフォームに表示され続けるように、Djangoテンプレートの構文を使って、もし現在のカテゴリIDが選択されたカテゴリIDと一致すれば、その項目にselected属性を付与する。これにより、ユーザーは以前の選択状態を確認し、修正することができる。
同様に、取引タイプ(収入/支出)を選択するドロップダウンリストも作成し、前回の選択状態をselected属性で保持する。日付を入力する<input type="date">要素や、検索キーワードを入力する<input type="text">要素についても、サーバーから渡されたstart_date、end_date、search_queryの値をvalue属性に設定することで、ユーザーが入力した内容がフォームに保持されるようにする。
最後に、ユーザーがフィルターを適用するための「Filter」ボタン(<button type="submit">)と、すべてのフィルター条件をクリアして初期状態に戻すための「Clear」リンクを配置する。「Clear」リンクは、フィルター条件が何も付加されていないベースのURL({% url 'transaction_list' %})に遷移するように設定することで、簡単にフィルターをリ解除できる。
このように、サーバー側でGETパラメータを受け取ってデータベースを絞り込み、その結果と選択状態をテンプレートに渡してフォームに反映させるという一連の連携によって、ユーザーはデータの絞り込みや検索を直感的に行える、使いやすいWebアプリケーションが実現される。これはシステムエンジニアとして、ユーザーフレンドリーなWebサービスを構築するための基礎的ながらも非常に重要なスキルとなる。