[Django] とりあえずこれだけ使えればOK!DjangoフレームワークのQuerySet

Djangoは、PythonベースのWebアプリケーションフレームワークとして広く利用されています。その中で、データベースとの効果的なやり取りを可能にするのが「Queryset」です。Querysetは、データベースからデータを取得・操作するための強力で柔軟なツールであり、Djangoの魅力的な機能の一つです。

Querysetとは?

Querysetは、Django ORM(Object-Relational Mapping)の一環として、データベースとやり取りするための抽象化レイヤーです。これは、SQLクエリを書かなくてもデータベースに対して高度な操作を行えるようにするものであり、開発者にとっては非常に便利な概念です。

一般的に、Querysetはデータベースのテーブルからデータを取得し、検索条件やフィルタリング、ソート、集計などを行うことができます。これにより、複雑なデータ操作をPythonコードで簡潔かつ効果的に表現することができます。

Querysetの特徴

  1. 遅延評価(Lazy Evaluation): Querysetは遅延評価を採用しており、クエリが実際に評価されるまでデータベースへのアクセスを行いません。これにより、必要な時点で最適なクエリを生成し、無駄なデータベースアクセスを避けることができます。
  2. チェーン可能なメソッド: Querysetはチェーン可能なメソッドを提供しており、複数のメソッドを組み合わせて一つのクエリを構築することができます。例えば、filter()で検索条件を指定し、order_by()でソート条件を追加するなどが可能です。
  3. 柔軟なフィルタリング: Querysetはデータのフィルタリングに優れており、複雑な条件を組み合わせてデータを絞り込むことができます。これにより、特定の要件に合ったデータを簡単に取得できます。

Null判定

MyModel.objects.filter(field__isnull=True)

一部一致

大文字・小文字の区別有り

MyModel.objects.filter(field__contains='文字列')

大文字・小文字の区別なし

MyModel.objects.filter(field__icontains='文字列')

数値比較

未満

MyModel.objects.filter(field__lt=数値)

以下

MyModel.objects.filter(field__lte=数値)

or条件

MyModel.objects.filter( Q(条件①) | Q(条件②) )

in句

MyModel.objects.filter( tableA__tableB__columnA__in=["aaa", "bbb"], )

除外

Class.objects.exclude(条件)
MyModel.objects.filter(~Q(条件))

データベース内の既存のフィールドの値を参照

クエリをより最適化されたものにし、パフォーマンスを向上させることができます。

F(‘column2‘)は、column2フィールドの値を取得するために使用されます。

from django.db.models import F 

MyModel.objects.filter(column1__lt=F('column2'))

特定のカラムリストの取得

辞書のQuerySetを取得

names = MyModel.objects.values('name')

リストを取得

flat=Trueを指定すると、単一の値のタプルではなく、値自体を直接返す。

names_list = list(MyModel.objects.values_list('name', flat=True))

Count

MyModel.objects.filter( columnA="aaa", ).values("columnB").annotate(count=Count("columnC"))