querysetについて分かりやすく解説【具体例で説明します】

djangoのドキュメントを見ていると、querysetという言葉をみる機会がたくさんあるかと思います。

ただ、その具体的な内容についてふれているサイトはあまり多くないのが現状。

しっかりと理解を深めるために、ここではquerysetについてわかりやすく説明していきます。
querysetは、djangoが準備した型のこと

まず、querysetが何なのかということについて簡潔にお伝えします。

querysetとは、Djangoが作っているQueryset型のデータのことです。

pythonであれば、str型やint型という型(クラス)がありますよね。

これと同じように、djangoが一から作ったQuerysetクラスに基づいて作られたオブジェクトがquerysetです。
querysetは、モデルから取り出した一連の情報

また、querysetはモデル(データベース)と密接にかかわっています。

ユーザーは、djangoに備えられたメソッドを使うことによって、モデルからデータを取り出すことができ、その一連のデータがquerysetと呼ばれます。
querysetは、メソッドによって取得される情報が変わる

また、querysetはどのように呼び出すかによって、データの中身が変わります。

例えば、データベースの中で直近1年のデータを取り出したものをquerysetにする。

投稿者がAさんのデータを取り出したものをquerysetにする。

というイメージです。この3つがquerysetの言葉による説明ですが、これらの説明ではイメージがわきづらいと思いますので、実際のコードを見ながら、querysetのイメージを固めていきましょう。
データベースからquerysetを取る方法

まず、データベースからquerysetを取る具体的な方法についてみていきましょう。

function based viewの場合とclass based viewの場合でコードの書き方が変わってきますので、順番にみていきましょう。
function based viewの場合

function based viewの場合のquerysetの取得方法です。

 コード

-BASE/app/models.py
class QueryModel(models.Model): 
        title = models.CharField(max_length=50)

 コード

def appview(request):   
    queryset = QueryModel.objects.「命令」
        return HttpResponse('')

モデルの名前.objects.「命令」というコードで、モデルに入っているデータを取り出すことができます。

まずは、全てのデータを取り出してみましょう。

 コード

def appview(request):   
    queryset = QueryModel.objects.all() 
        print(queryset)   
        return HttpResponse('')

サーバーを立ち上げ、localhost:8000/fbv/にアクセスすると、コンソールにquerysetが出力されます。

 コマンドライン


<QuerySet [<AppModel: データ1つ目>, <AppModel: データ2つ目>, <AppModel: データ3つ目>]>
QuerySetが出力されていることが分かります。これがQueryset型かどうかを確認するために、typeメソッドを使ってみましょう。

 コード

def appview(request):   
        queryset = QueryModel.objects.all()   
        print(type(queryset))   
        return HttpResponse('')

 コマンドライン


<class 'django.db.models.query.QuerySet'>

QueryModel.objects.all()で取得したデータはQuerySet型であることが確認できました。
QuerySetから個別のデータを取り出す方法

少しずつquerysetへの理解を深めていきましょう。

次に、querysetから個別のデータを取り出す方法をみていきましょう。

 コード

def appview(request):   
        queryset = QueryModel.objects.all()   
        print(queryset[0].title)   
        return HttpResponse('')

 コマンドライン

  内容
queryset[0]は1つ目のデータ、そして、.titleを使って1つ目のデータからtitleを取得することができていることが分かります。

このように、querysetにはモデルのデータが入っており、それらを一つずつ取り出すことができる。ということを理解しましょう。
querysetは、iterableである

少し技術的な観点からの説明です。

querysetはiterableです。

つまり、for文を使うことによって、querysetに入っているデータを一つずつ取り出すこともできます。

iterableについて理解を深めたい方は、イテレーターという記事を参考にしてください。
class based viewの場合

次はclass based viewの場合です。

 コード

class AppView(ListView):   
           queryset = AppModel.objects.all()   
           context_object_name = 'appquery'
class based viewの場合、このように設定をすることによってquerysetを取得することができます。

この場合は、objects.allとしていますので、djangoであらかじめ準備されているobject_listと同じデータになりますが、filterを使うことによってquerysetに入れるデータを変えることができるということを覚えておくとよいでしょう。~Django

~Django無料講義~のご案内

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