Djangoのクエリで特定のカラムの値をリストを取得する
Djangoでクエリの実行結果として、特定のカラムのみ取得するにはvaluesが使えます
例えばこんなモデルがあるとして
class Book(models.Model): title = models.CharField(max_length=100) published = models.DateField()
titleだけ取得する場合は以下のように書けます。
取得されるのは、辞書のリストになります。
>>> Book.objects.values('title') [{'title': u'Clean Corder'}, {'title': u'アジャイルサムライ'}, {'title': u'ハッカーと画家'}]
値だけをリストで取得したい場合は、リスト内包表記を使ってvaluesで返された値を変換することもできますが
>>> [book['title'] for book in Book.objects.values('title')] [u'Clean Corder', u'アジャイルサムライ', u'ハッカーと画家']
こういう場合はvalues_listを使うと同じ結果を得られます。
(ただしflat=Trueを渡す必要がある)
>>> Book.objects.values_list('title', flat=True) [u'Clean Corder', u'アジャイルサムライ', u'ハッカーと画家']
flat=Trueを渡さないと、タプルのリストが返されます。
>>> Book.objects.values_list('title') [(u'Clean Corder', ), (u'アジャイルサムライ', ), (u'ハッカーと画家', )]
ちなみにカラム名を2つ以上指定して、flat=Trueを渡すとTypeErrorになります
TypeError: 'flat' is not valid when values_list is called with more than one field.