この記事でお伝えすること
- valuesとvalues_listの機能
- valuesとvalues_listの違いについて
- valuesとvalues_listの使い方、サンプルコード
を紹介していきます。
djangoのQuerySetの中にvaluesとvalues_listという非常に似ている関数があります。
この似ている関数2つを使う場合にはまず共通点、違う点を探さないと困惑しやすいです。
それにdjangoを学び始めた初心者に、公式サイトからvaluesとvalues_listの共通点、違う点を探すのは分かりにくく大変です。
そのため、本記事では初心者でも分かりやすいように、valuesと values_listについて解説していき
この2つはどういった機能を持つか、何が違うのかもお伝えしていきます。
valuesとvalues_listの機能
まず、最初に言えることは、valuesとvalues_listの基本的な機能はほとんど一緒です。
valuesとvalues_listともにデータベースのデータを全て出力します。
では、実際にvaluesとvalues_listで出力を行ってみます。
まず、元となるデータベースのモデルは以下のようになっています。
from django.db import models
class Sample(models.Model):
title = models.CharField(max_length=200)
text = models.TextField()
values と values_list の出力
では、valuesとvalues_listの出力を見ていきましょう。
shellを使い、すぐに出力結果が出るインタラクティブモードに変更していきます。
python manage.py shell
インタラクティブモードに変更後、早速コードを打ってみていきます。
from models import Sample
# values()
print(Sample.objects.values())
>> <QuerySet [{'id': 1, 'title': 'title1', 'text': 'text1'}, {'id': 2, 'title': 'title2', 'text': 'text2'}, {'id': 3, 'title': 'title3', 'text': 'text3'}]>
# values_list()
print(Sample.objects.values_list())
>> <QuerySet [(1, 'title1', 'text1'), (2, 'title2', 'text2'), (3, 'title3', 'text3')]>
ここで出力結果はほとんど同じですが、出力形式が異なります。
2つの違いとなる出力形式に関しては後ほど解説します。
values と values_list の引数
ちなみに、valuesとvalues_listのどちらとも引数にフィールドを入れることができます。
フィールドを入れると該当フィールドのみが出力されます。
print(Sample.objects.values('title'))
>> <QuerySet [{'title': 'title1'}, {'title': 'title2'}, {'title': 'title3'}]>
print(Sample.objects.values_list('title'))
>> <QuerySet [('title1',), ('title2',), ('title3',)]>
引数にフィールドを持ってくると該当のフィールドの値のみが出力されます。
しかし、相変わらず出力形式が異なります。この出力形式の違いについて解説します。
valuesとvalues_listの違いは?
以上の出力例から分かる様に、出力するデータ形式が異なりました。
出力例から分かるように、valuesは辞書型として出力し、values_listはタプルとして出力します。
しかし、違いは出力結果だけではないです。引数として取る値も変わってきます。
values の引数は以下の通りです。
values(*fields,**expressions)
一方、values_list の引数は以下のようです。
values_list(*fields,flat=False,named=False)
valuesとvalues_listでは引数として同じfieldsが使われています。そのため、上記の例では、引数に’title’を入れて同じような出力結果を出しました。
しかし、それ以外の引数は異なります。
では、それぞれvaluesとvalues_listの使い方と引数による出力結果を見ていきます。
valuesの使い方、サンプルコード
valuesの出力結果と、fieldsとexpressionsのそれぞれに引数を入れた場合をざっと紹介します。
# 引数なし
print(Sample.objects.values())
>> <QuerySet [{'id': 1, 'title': 'title1', 'text': 'text1'}, {'id': 2, 'title': 'title2', 'text': 'text2'}, {'id': 3, 'title': 'title3', 'text': 'text3'}]>
# 引数:fields
print(Sample.objects.values('title'))
>> <QuerySet [{'title': 'title1'}, {'title': 'title2'}, {'title': 'title3'}]>
# 引数:expressions
from django.db.models.functions import Upper
print(Sample.objects.values(upper_title=Upper('title')))
>> <QuerySet [{'upper_title': 'TITLE1'}, {'upper_title': 'TITLE2'}, {'upper_title': 'TITLE3'}]>
「引数なし」と「引数:fields」、「引数:expressions」の場合の出力を書きました。
「引数なし」と「引数:fields」は今まで見てきました。
そのため、「引数:expressions」を見ていきます。
最初にmodels.functionsからUpperを引っ張ってきています。
expressionsでは出力結果の表示を変化させることができるため、models.functionsから大文字に変更させるUpper関数を引っ張ってきています。
そのため、出力が全て大文字に変更した出力結果になります。
values_listの使い方、サンプルコード
valuesと同様に、values_listの引数がない出力結果と、fields、flat=Trueの場合、named=Trueの場合の出力をそれぞれ一つずつ見ていきます。
# 引数なし
print(Sample.objects.values_list())
>> <QuerySet [(1, 'title1', 'text1'), (2, 'title2', 'text2'), (3, 'title3', 'text3')]>
ちなみにvalues_listには引数としてのexpressionsがないですが、modelの functionを使用したい場合は以下の様にします。
# 引数:fields とfunctionを使用した場合
from django.db.models.functions import Upper
print(Sample.objects.values_list('title', Upper('title')))
>> <QuerySet [('title1','TITLE1), ('title2','TITLE2'), ('title3','TITLE3)]>
ここでは引数としてfieldsを使用した場合とfunctionを使用した場合を同時に出力しています。
それが(‘title’, Upper(‘title’))の部分です。
また、values_listの次の引数であるflat=Trueの場合を見ていきます。
flat=Trueの場合、出力結果は変わりませんが出力される形式に変化が出ます。
print(Sample.objects.values_list('title',flat=True))
>> <QuerySet ['title1', 'title2', 'title3']>
今まではオブジェクトごとにタプルで出力されていた結果だったのですが
flat=Trueでリスト形式で一括りにされた結果が出力されます。
最後にnamed=Trueにすると
print(Sample.objects.values_list('title',named=True))
>> <QuerySet [Row(title='title1'), Row(title='title2'), Row(title='title3')]>
辞書型に近い出力ですが、Rowに括られて出力されます。
最後に
以上がvaluesとvalues_listに関する記述になります。
ここで他の記事の宣伝です。
django初心者、今djangoの勉強を始めたばかりの方には以下の記事をオススメします。
入門者に向けて、djangoの勉強方法をまとめたものになります。どのような勉強方法があるか見てみてください。
それと、djangoをより勉強したい方にはこちらの記事をオススメします。