Djangoのクエリセットから値を取得する方法
Djangoのクエリセットから値を取得する方法をご紹介します。
目次
条件
- Django 2.1.4
- Python 3.7.0
前提
モデル
以下のようなモデルが定義されているとします。
class Location(models.Model):
"""場所モデル"""
class Meta:
db_table = 'location'
name = models.CharField(verbose_name='ロケーション名', max_length=255)
memo = models.CharField(verbose_name='メモ', max_length=255, default='', blank=True)
author = models.ForeignKey(
'auth.User',
on_delete=models.CASCADE,
)
created_at = models.DateTimeField(verbose_name='登録日時', auto_now_add=True)
updated_at = models.DateTimeField(verbose_name='更新日時', auto_now=True)
def __str__(self):
return self.name
データ
以下のようなデータがDBに存在するものとします。
クエリセットからの値取得
レコード1件を取得してカラム指定
- ポイント
- pkまたはidで指定します。
- カラム名を指定して情報を取り出します。
実行結果
from monitor.models import Location
result = Location.objects.get(pk=1)
print('result = ' + result.name)
> result = 東京
from monitor.models import Location
result = Location.objects.get(id=1)
print('result = ' + result.name)
> result = 東京
特定のカラム値を取得
- ポイント
- values_list() の引数の渡したフィールド値のタプルリストを返します。
- flat = True とすると1要素のタプルではなく一つの値として返されます。
実行結果
result = Location.objects.values_list('name', flat=True).get(pk=1)
print('result = ' + result)
> result = 東京
Location.objects.values_list('memo', flat=True).get(pk=2)
print('result = ' + result)
> result = 沖縄です。
参考:flat=Falseの場合
結果はタプルで返ります。
実行結果
result = Location.objects.values_list('name', flat=False).get(pk=1)
print('result = ' + result)
> result = ('東京',)
Location.objects.values_list('memo', flat=False).get(pk=2)
print('result = ' + str(result))
> result = ('沖縄です。',)
参考:flat=Falseで複数指定の場合
結果はタプルで返ります。
result = Location.objects.values_list('name', 'memo', 'created_at', flat=False).get(pk=1)
print('result = ' + str(result))
> result = ('東京', '東京です。', datetime.datetime(2018, 12, 19, 11, 57, 8, 856505))
クエリセットからの値取得(辞書形式)
- ポイント
- values() の引数の渡したフィールド値の辞書リストを返します。
実行結果
result = Location.objects.values('name').get(pk=1)
print('result = ' + str(result))
print('result = ' + result.get('name'))
> result = {'name': '東京'}
> result = 東京
参考:複数指定の場合
実行結果
result = Location.objects.values('name', 'memo').get(pk=2)
print('result = ' + str(result))
print('result = ' + result.get('name'))
print('result = ' + result.get('memo'))
> result = {'name': '沖縄', 'memo': '沖縄です。'}
> result = 沖縄
> result = 沖縄です。
すべての結果を取得
- ポイント
- QuerySetで返った結果をforループで値を取り出します。
実行結果
result = Location.objects.all()
print('result = ' + str(result))
for data in result:
print('name = ' + data.name)
print('memo = ' + data.memo)
print('created_at = ' + str(data.created_at))
> result = <QuerySet [<Location: 東京>, <Location: 沖縄>]>
> name = 東京
> memo = 東京です。
> created_at = 2018-12-19 11:57:08.856505
> name = 沖縄
> memo = 沖縄です。
> created_at = 2018-12-19 11:57:18.820476
参考:結果をタプルに変換
実行結果
result = Location.objects.all()
name = [data.name for data in result]
memo = [data.memo for data in result]
created_at = [data.created_at for data in result]
print('name = ' + str(name))
print('memo = ' + str(memo))
print('created_at = ' + str(created_at))
> name = ['東京', '沖縄']
> memo = ['東京です。', '沖縄です。']
> created_at = [datetime.datetime(2018, 12, 19, 11, 57, 8, 856505), datetime.datetime(2018, 12, 19, 11, 57, 18, 820476)]
参考
Qiita:Django データベース操作 についてのまとめ
https://qiita.com/okoppe8/items/66a8747cf179a538355b
Django公式:QuerySet API reference
https://docs.djangoproject.com/ja/2.1/ref/models/querysets/
Django v1.0 documentation:QuerySet APIリファレンス
http://djangoproject.jp/doc/ja/1.0/ref/models/querysets.html



