見出し画像

【タレントダッシュボード構築 #5】社員一覧画面をつくる②

今回は検索機能についてまとめていきます。

検索機能はdjango-filterというライブラリを利用して実装します。
詳細は公式ドキュメントをご覧いただきたいのですが、一言でいうと「モデルのフィールドに基づいてクエリセットを絞り込み、その内容をビューに表示する仕組みを提供する機能群」です。

今回例として示した画面では、以下の通り実装しています。

[filters.py]

import django_filters
from django_filters import rest_framework as filters
from django.db import models

from .models import Item

class ItemFilterSet(django_filters.FilterSet):
    CH_line = (('1', '部室長等'), ('2', '課長等'), ('3', 'その他'))    
    code_7 = filters.CharFilter(field_name="code_7", lookup_expr='contains', label="社員コード")
    name = filters.CharFilter(field_name="name", lookup_expr='contains', label="氏名")
    name_kana = filters.CharFilter(field_name="name_kana", lookup_expr='contains', label="カナ氏名")
    honbu = filters.AllValuesMultipleFilter(label="所属本部(複数選択可)")
    dept = filters.CharFilter(field_name="dept", lookup_expr='contains', label="所属部室")
    kyu = filters.AllValuesMultipleFilter(label="級(複数選択可)")
    line = filters.MultipleChoiceFilter(choices=CH_line, label="ライン(複数選択可)")
    univ_name = filters.CharFilter(field_name="gakureki__univ_name", lookup_expr='contains', label="出身大学名")

django-filtersではさまざまな絞り込みの方法が定義されています。
今回構築するサイトで利用しているものを中心に、いくつかピックアップし説明します。
※最新・全量については公式ドキュメントをご覧ください。

CharFilter

モデルで定義した項目のうちCharFieldおよびTextFieldに適用できるフィルタです。ルックアップ方法についてはdjango公式ドキュメントをご覧ください。たとえば今回、社員コードや氏名、カナ氏名などを検索する場合には lookup_expr='contains' を指定し、部分一致検索を行っています。

ChoiceFilter

今回構築するサイトでは利用していませんが、複数の選択肢から一つを選んで絞り込みを行う際に利用します。

MultipleChoiceFilter

基本的にはChoiceFilterと同様ですが、読んで字の如くこちらのフィルタでは複数選択することが可能です。

CH_line = (('1', '部室長等'), ('2', '課長等'), ('3', 'その他'))  

上記のように、選択肢を宣言してからそれを呼び出すことが一般的です。

AllValuesFilter

ChoiceFilterと類似していますが、こちらのフィルタでは「発生しているデータから選択肢を生成する」という点が異なります。
例えば組織改編に伴って部室名のマスタを修正するというような手間を省くことができ、変更に強いといえます。

AllValuesMultipleFilter

基本的にはAllValuesFilterと同様ですが、読んで字の如くこちらのフィルタでは複数選択することが可能です。

【補足】
「出身大学名」で検索を行う機能も付けており、検索対象のフィールドに以下を指定しています。
field_name="gakureki__univ_name"
djangoでは、リレーション先のカラムをアンダースコア2つ(”__”)を使って呼び出すことができます。

さて、ユーザの入力内容に従って絞り込んだ結果をビューに連携するため、views.pyを以下の通り定義します。

[views.py]
from .filters import ItemFilterSet
"""(略)"""

class ItemFilterView(PermissionRequiredMixin, FilterView):
    model = Item
    permission_required = ("app.view_item",)
    filterset_class = ItemFilterSet


次回からは、社員の詳細情報を表示する画面を構築していきます。


この記事が気に入ったらサポートをしてみませんか?