• Qオブジェクトの使い方を解説【具体的なコード付き】

    検索フォームを作るときに使われることが多いQオブジェクト。

    この具体的な使い方を知りたいけど、よくわからないという方も多いのではないかと思います。

    そこで今回は、Qオブジェクトの使い方を分かりやすく解説していきます。

    Qオブジェクトはor検索をするときに使われる

    Qオブジェクトは、モデルのデータの中からor検索をする時に使われます。

    実際のコードをみながら、中身について理解していきましょう。

    Qオブジェクトは、データをカプセル化させる

    また、Qオブジェクトはデータをカプセル化させるというイメージを持つとわかりやすいかと思います。

    具体的な図を使って説明しましょう。

    カプセル化のイメージ

    上にあるのがモデルに入っているデータです。

    このデータが、Qオブジェクトによってふるいにかけられ、その結果がそれぞれまとめられています。

    このまとめられたデータは、カプセルの中に入っているようなイメージなので、カプセル化と呼ばれています。

    カプセル化させたデータは重複している可能性も十分にあり得ますよね。

    だからこそ、Qオブジェクトはor検索のときに使われるのです。

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

    ここから、Qオブジェクトの使い方をみていきましょう。

    Qオブジェクトは、filterメソッドとともに使われることが多いです。

    補足
    

    getメソッドと共に使うこともできますが、getメソッドは一つのオブジェクトを取ることしかできません(fileterのように一連のデータを返すことができませn)ので、実質的にgetメソッドとQオブジェクトを一緒に使う機会はほとんどないかと思います。

    初期設定したコードの詳細については初期設定コードという記事を参考にしてください。

    コード
    

    -BASE/app/models.py

    class NewModel(models.Model):

        title = models.CharField(max_length=50)

        content = models.TextField()

    コード
    

    -BASE/app/urls.py

    from django.urls import path

    from .views import qobuject

     

    urlpatterns = [

        path('fbv', qobject, name='qobject'),

    ]

    コード
    

    -BASE/app/views.py

    1 from django.http import HttpResponse

    2 from db.models import Q

     

    3 def qobject(request):

    4     objects = NewModel.objects.filter(Q(title_startswith='1'))

    5     print(objects)

    6    return HttpResponse('')

    コードの解説
    

    (1) まず、2行目でQオブジェクトをimportしていることを確認しましょう。

    (2) 4行目で実際にQオブジェクトを使っています。具体的には、NewModelの中のデータにおいて、titleが1から始まるデータがqueryset型のデータとしてobjectsに格納されます。

    実際にコマンドラインで出力結果をみてみましょう。

    なお、事前にtitleが1234というデータを一つ作っていることを前提としています。

    コマンドライン
    

    <QuerySet [<NewModel: 1234>]>

    queryset型のデータを確認することができました。

    このように、filterと組み合わせてQオブジェクトを使うことができます。

    or検索のやり方

    次に、or検索をする方法についてみていきましょう。

    or検索をするには、|を使います。

    具体的なコードをみてみましょう。

    コード
    

    -BASE/app/views.py

    1 from django.http import HttpResponse

    2 from db.models import Q

     

    3 def qobject(request):

    4     objects = NewModel.objects.filter(Q(title_startswith='1') | Q(title_endswith='2')

    5     print(objects)

    6    return HttpResponse('')

    4行目に注目してください。

    |をつかってQオブジェクトを二つ書きました。このように書くことで、or検索をすることができるようになります。

    qオブジェクトで使える検索条件

    最後に、Qオブジェクトd使える検索条件(主なもの)をまとめました。

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

    言葉 条件
    exact 完全一致(大文字小文字の区別あり)
    iexact 完全一致(大文字小文字の区別なし)
    contains, icontains 部分一致
    startswith, istartswith 始めに一致
    endswith, iendswith 終わりに一致
    gt  超
    gte 以上
    lt 未満
    lte 以下

    Qオブジェクトのまとめ

    (1) Qオブジェクトはモデルのデータをカプセル化する

    (2) filterメソッドと一緒に使われるのが一般的

    (3) |を使ってor検索ができる

    ~Django無料講義~のご案内

    Code for Djangoが、4時間超の無料Django講義をはじめました

    •  ・本を出版したCode for Djangoの
       製作者が作ったサイトです。
    •  ・Code for Djangoの内容も、
       動画で詳しく解説しています。
    •  ・動画は順次ふやしていきますので、
       ただで学び続けることが可能です。
    •  ・Djangoの効率的なスキルアップに、
       是非お役立て下さい。