Django ORMで特定カラムのみ取り出す


はじめに

今回はDjango ORMで特定カラムのみ取り出す方法についてご紹介します.

ORMとは

ORMとは、Object Relational Mappingの頭文字を取ったもので、オブジェクトとRDBとのマッピングをしてくれるものです.簡単にいうと、SQLを書くことなくRDBのデータを操作できるものです.
今回の記事ではこの程度の理解で読み進めれると思います.

本題

では、本題です.
まず、例として次のようなカラムを持つusersテーブルというものがあると考えます.

  • id
  • name
  • email

このようなテーブルから、idnameのみをリストとして取り出したい際に下記のようなことはしたくないですよね.(今回はmodelの定義などは省略します)

def sample(request):
	sample_users = User.objects.all()
	sample_user_list = []
	for sample_user in sample_user:
		user = {
			"id": sample_user.id,
			"name": sample_user.name
		}
		sample_user_list.append(user)
	return sample_user_list

そこで、values()values_list()などを用いることで、同じようなことができます.
values()を用いたサンプルコードは以下です.

def sample(request):
	'''
	QuerySetで返ってくる
	ex) <QuerySet [{"id": 1, "name": hoge}, ...]>
	'''
	sample_users = User.objects.values('id', 'name')
	return list(sample_users)

とても簡潔になりましたね.
values_list()を用いる場合でも同様に書くことができ、取得結果は下記のようになります.

<QuerySet [(1, 'hoge'), ...]>

values()とvalues_list()の違い

では、values()values_list()の違いはなんでしょうか.
上記の取得結果を見ればわかりますが、取得したデータのカラム名(ex."id")があるかないかです.values()がカラム名があり、values_list()はカラム名がなく、タプルで返されます.

また、values_list()に関しては、指定するカラムが一つの場合、flat=Trueをつけることで配列として取り出すことができます.使用例は以下です.

User.objects.value('id', flat=true)
# <QuerySet [1, 2, 3, ...]>

まとめ

今回はDjango ORMで特定カラムを取り出す方法についてご紹介しました.Django ORMには他にも様々な機能があり、SQLを書かずに容易なデータ操作を可能にしてくれます.