エンジニア通信Vol.8 ~DjangoのQオブジェクトの使い方~
お久しぶりです。開発エンジニアのOです。
エンジニア通信 3回目の登場です。
さて、今回のエンジニア通信では DjangoのQオブジェクトの使い方 に焦点を当てたいと思います。Djangoによる集計は弊社が展開しているサービス「wacca」でも多くの場面で用いられています。
Qオブジェクトとは🤔
Qオブジェクトは、検索フォームを作るときに使用されることが多いです。ANDなどの演算子に加え OR演算子を使って、モデルのデータから条件に合ったものを検索し取得する 際に使用します。
fillter() とは違うの?
filter()では、与えられたパラメータ(条件)を AND で結合します。そのため、OR文を含むクエリを実行するには、Qオブジェクトを使用することで可能になります。
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月にもかかわらず、全国的に真夏日、猛暑日が続いていますよね。体調管理を万全にして、今年の夏🍉を乗り越えていきましょう!!