こんにちは!Masaです。
今回はDjangoのクエリセットから特定の項目に絞って値を取り出す方法について解説します。
Django クエリセットとは
まず前提条件として、Djangoにおけるクエリセットは何なのかについて調べてみました。
一言でいうと、「Djangoに備えられたメソッドを使用して取得する、Djangoが用意したデータの型」だそうです。
様々なプログラミング言語でstr形やint型などがあるように、Djangoでqueryset型があるということですね。
クエリセットの取り出し方(基本)
早速、Djangoにおけるクエリセットをデータベースから取得する方法を見ていきましょう。
クエリセットはほとんどの場合、“モデル名.objects.”という形で取得します。
“モデル名.objects.”の使い方は以下の記事でも解説しています。
またデータ取得の際に条件をつけて特定のデータだけ取り出したいこともあると思います。
その場合は”filter()”というメソッドを使用して取得します。
今回は特定の項目(カラム)に絞ったデータの取り出し方を見ていきます。
項目を絞った取り出し方
まず例として使用するモデルは以下の架空の選手名簿とします。
from django.db import models
class Player(models.Model):
name = models.CharField()
team = models.CharField()
age = models.IntegerField()
birthplace = models.CharField()
def __str__(self):
return self.name
データベースには以下のような架空の選手を登録してみました。
このデータベースを使用して、様々な条件でデータの取得をしてみましょう。
特定の項目の値をタプルの形で取得
特定の項目をタプルの形で取り出します。
タプルの形で取得するには”values_list”を使用します。
チーム名を取得してみましょう。
player = Player.objects.values_list("team", flat=True)
print(player)
出力:<QuerySet ['ファルコンズ', 'タイガース', 'オーシャンズ', 'ファルコンズ', 'タイガース', 'オーシャンズ', 'タイガース', 'オーシャンズ', 'ファルコンズ']>
クエリセットで出力されていることがわかりますね。
ちなみに、flat=Trueは1つの値として返すことを表しています。
flat=Falseの場合は以下のようになります。
player = Player.objects.values_list("team", flat=False)
print(player)
出力:<QuerySet [('ファルコンズ',), ('タイガース',), ('オーシャンズ',), ('ファルコンズ',), ('タイガース',), ('オーシャンズ',), ('タイガース',), ('オーシャンズ',), ('ファルコンズ',)]>
出力結果の形が変わってきます。
1つ1つがタプルの要素となっているのがわかります。
また複数の項目を選んで取得することもできます。
player = Player.objects.values_list("name", "team", flat=False)
print(player)
出力:<QuerySet [('山下', 'ファルコンズ'), ('瀬戸', 'タイガース'), ('酒井', 'オーシャンズ'), ('筒井', 'ファルコンズ'), ('葛西', 'タイガース'), ('佐藤', 'オーシャンズ'), ('井上', 'タイガース'), ('柏木', 'オーシャンズ'), ('鈴木', 'ファルコンズ')]>
複数の項目を指定する場合、”flat=False”のみとなります。(”flat=True”とはできない)
特定の項目の値を辞書の形で取得
次に辞書型で取得する方法です。
辞書型は“values”を使用します。
チーム名に絞って取得したいと思います。
player = Player.objects.values("team")
print(player)
出力:<QuerySet [{'team': 'ファルコンズ'}, {'team': 'タイガース'}, {'team': 'オーシャンズ'}, {'team': 'ファルコンズ'}, {'team': 'タイガース'}, {'team': 'オーシャンズ'}, {'team': 'タイガース'}, {'team': 'オーシャンズ'}, {'team': 'ファルコンズ'}]>
辞書の形になっているのが、”values_list”との違いであり、得られる内容に変わりはありません。
こちらも複数項目の選択が可能です。
“values_list”や”values”でできること
ここまで2つの方法を使用して特定の項目に絞って取得する方法を見てきました。
この2つの方法は基本データベース上のデータ全てを取り出すことが基本になります。
「ある項目だけを取り出した名簿を作る」などをイメージすると、使い方のイメージがわくかもしれないですね。
コメント