はじめに
DjangoのORM(オブジェクトリレーショナルマッピング)は、データベース操作を簡素化する強力なツールです。SQLを直接記述する代わりに、Pythonコードを使ってデータベースの検索や操作を行えます。本記事では、Django ORMを使用した検索フィルタリングの中でも、大文字小文字の扱いや数値比較に焦点を当てて解説します。
大文字小文字を区別しない検索と区別する検索
Djangoでは、フィールド値の検索において大文字小文字を区別するかどうかを選択できます。以下にそれぞれの方法を解説します。
大文字小文字を区別しない検索(icontains
)
icontains
を使用することで、大文字小文字を区別せずにフィールド値を検索できます。
queryset = Clients.objects.filter(name__icontains='john')
このクエリは、name
フィールドに「john」を含むすべてのClients
オブジェクトを返します。たとえば、次のようなデータが一致します:
'John'
'john'
'JOHN'
'JoHn'
大文字小文字を区別する検索(contains
)
contains
を使用すると、大文字小文字を区別した検索が可能です。
queryset = Clients.objects.filter(name__contains='john')
このクエリは、name
フィールドに「john」を正確に含むレコードのみを返します。したがって、'John'
や'JOHN'
は一致しません。
補足:icontains
のi
の意味
icontains
の先頭のi
は「case-insensitive(大文字小文字を区別しない)」の略です。Djangoでは、icontains
のようにi
を加えた検索フィルタを利用することで、より柔軟な検索が可能になります。
Djangoでの数値比較検索:lt
と gt
数値や日付などの比較検索を行う場合、Django ORMではlt
(未満)やgt
(より大きい)を使用します。
lt
(未満)を使用した検索
以下の例では、商品の価格が1000円未満の商品を検索します。
queryset = Product.objects.filter(price__lt=1000)
このクエリは、price
フィールドの値が1000未満のProduct
オブジェクトを返します。
gt
(より大きい)を使用した検索
契約の終了日が今日またはそれ以降であるレコードを取得する例です。
contracts = Contracts.objects.filter(end_date__gte=today)
-
gt
: 「より大きい」(greater than) -
gte
: 「以上」(greater than or equal to)
応用例:除外条件と複合フィルタ
以下は、特定の契約を除外し、さらに終了日が今日以降または未定のものを取得する例です。
contracts = Contracts.objects.exclude(id__in=assigned_contract_ids).filter(
Q(end_date__gte=today) | Q(end_date__isnull=True)
)
-
exclude
: 指定条件を満たすレコードを除外します。 -
Q
オブジェクト: 複数条件のOR/AND検索を簡潔に記述できます。
補足情報
-
日付フィルタリング:
lt
やgt
は、数値だけでなく日付や時間などにも使用可能です。 -
複雑な条件:
icontains
やlt
などを組み合わせることで、柔軟なクエリ構築が可能になります。
実務での活用例
私の実務経験では、これらのフィルタを使用して次のような検索条件を実装しました:
- ユーザー名や会社名の部分一致検索。
- 契約終了日が未設定のレコードの取得。
まとめ
- 大文字小文字を区別しない検索には
icontains
、区別する検索にはcontains
を使用。 - 数値や日付の比較には
lt
(未満)やgt
(より大きい)を活用。 - DjangoのORMは簡潔なコードで柔軟なクエリを実現可能。