見出し画像

エンジニア通信Vol.8 ~DjangoのQオブジェクトの使い方~

お久しぶりです。開発エンジニアのOです。
エンジニア通信 3回目の登場です。

さて、今回のエンジニア通信では DjangoのQオブジェクトの使い方 に焦点を当てたいと思います。Djangoによる集計は弊社が展開しているサービス「wacca」でも多くの場面で用いられています。


Qオブジェクトとは🤔

Qオブジェクトは、検索フォームを作るときに使用されることが多いです。ANDなどの演算子に加え OR演算子を使って、モデルのデータから条件に合ったものを検索し取得する 際に使用します。

fillter() とは違うの?

filter()では、与えられたパラメータ(条件)を AND で結合します。そのため、OR文を含むクエリを実行するには、Qオブジェクトを使用することで可能になります。

Qオブジェクト=データのカプセル化

図1.カプセル化イメージ

Djangoの公式ドキュメントでは、次のように説明しています。

Q オブジェクト(django.db.models.Q) は、キーワード引数のコレクションをカプセル化するために使われるオブジェクトです。

Django公式ドキュメント

言い換えるならば、Qオブジェクトはデータをカプセル化させるイメージになるかと思います。図1では住所が 東京で始まるデータ市で終わるデータ それぞれをカプセル化しています。

しかし、カプセル化したデータは、重複している可能性があります。そういうときに、Qオブジェクトを用いてOR検索を行います!

実践💪

Qオブジェクトの具体的な使い方

さっそく、具体的な使い方を見ていくことにしましょう。

// モデル
class Store(model.Model):
  store_name = models.CharField(max_length=100)  // 店舗名
 address = models.CharField(max_length=200) // 所在地(Ex. ○○県××市)
  :
  :
// ビュー
from db.models.import Q


def getStore(request):
 query_set = Store.objects.filter(
        Q(address__startswith="東京")
       )

【解説】
1.ビューファイル内でQオブジェクトをインポートしています。
2.Storeモデル内のデータから、所在地が 東京で始まるデータがQuerySet型として、オブジェクトに格納されます。
<取得例>
東京都品川区
東京都八王子市
東京都奥多摩町 など

OR検索の方法

Qオブジェクトは | 演算子を使うことでOR検索が可能になります。
さっそく、使い方をみていきましょう。

// ビュー
from db.models.import Q


def getStore(request):
 query_set = Store.objects.filter(
        Q(address__startswith="東京")
        | Q(address__endswith="市")   
       )

【解説】
| 演算子を用いて、Qオブジェクトを2つ書きました。これにより、OR検索が可能になり、所在地が 東京から始まるデータ に加え、○○市で終わるデータも取得できます。
<取得例>
東京都品川区
東京都八王子市
東京都奥多摩町
千葉県船橋市
神奈川鎌倉市 など

AND検索の方法

Qオブジェクトは & 演算子を使うことでAND検索が可能になります。
さっそく、使い方をみていきましょう

// ビュー
from db.models.import Q


def getStore(request):
 query_set = Store.objects.filter(
        Q(address__startswith="東京")
        & Q(address__endswith="市")   
       )

【解説】
& 演算子を用いて、Qオブジェクトを2つ書きました。これにより、AND検索が可能になり、所在地が 東京から始まり、かつ○○市で終わる データが取得できます。
<取得例>
東京都八王子市
東京都立川市 など

ぜひ、実際のコードを書く際の参考にしてみてください。


ひとりごと🤫

私の記憶が正しければ、24年ぶり38.0℃超の発熱🤒を経験しました。
おそらく、免疫力が低下していたのでしょうね。

免疫力をあげる方法を chatGPT が教えてくれたので、参考にして健康な体づくりに励みたい思っている今日この頃。。
最近は5月にもかかわらず、全国的に真夏日、猛暑日が続いていますよね。体調管理を万全にして、今年の夏🍉を乗り越えていきましょう!!