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に入れるデータを変えることができるということを覚えておくとよいでしょう。