🍣
Django ORMで特定カラムのみ取り出す
はじめに
今回はDjango ORMで特定カラムのみ取り出す方法についてご紹介します.
ORMとは
ORMとは、Object Relational Mappingの頭文字を取ったもので、オブジェクトとRDBとのマッピングをしてくれるものです.簡単にいうと、SQLを書くことなくRDBのデータを操作できるものです.
今回の記事ではこの程度の理解で読み進めれると思います.
本題
では、本題です.
まず、例として次のようなカラムを持つusers
テーブルというものがあると考えます.
- id
- name
このようなテーブルから、id
とname
のみをリストとして取り出したい際に下記のようなことはしたくないですよね.(今回は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を書かずに容易なデータ操作を可能にしてくれます.
Discussion