DjangoでQuerySetの特定フィールドの値のみをリスト形式で取得するのイメージ画像

DjangoでQuerySetの特定フィールドの値のみをリスト形式で取得する

  • 公開日:2019/06/07
  • 更新日:2019/06/07
  • 投稿者:n bit

Djangoでforループを使わず、直接QuerySetの特定フィールドの値のみをリスト形式で取得する方法の解説です。forループを利用しないのでコードもシンプルで処理も高速化できます。最終的にリストデータのみ必要な場合はこちらを利用しましょう。

  • Python
  • Django

この記事は約 分で読めます。(文字)

QuerySetの特定フィールドの値のみをリスト形式で取得

QuerySetの特定フィールドから直接値のみをリスト形式で取得します。「フィルタリングしたQuerySetのPKのみをリスト化したい」等の用途に便利です。

下記のようなモデルからリスト形式を取得するとします。

models.py

class SampleModel(models.Model):

no = models.FloatField(default=0, verbose_name='No,')

QuerySetから直接リスト形式で取得するには『values_list』メソッドを利用します。例えば『no』フィールドに『1.0』が入っているレコードのPKのみリストで取得する場合は以下の通りです。

views.py

pk_list = SampleModel.objects.filter(no=1.0).values_list('pk', flat=True)
  • flat=True を付与しない場合はダプル形式のリストで取得されます。
  • flat=True を付与する場合フィールドは1つしか指定できません

実はこの取得された『pk_list』は完全なリスト形式になっているわけではなく、あくまで『QuerySetのリスト』となっています。そのためリストとして利用するためには『list()』を使って最終リスト形式に変更しておきましょう。

pk_list = SampleModel.objects.filter(no=1.0).values_list('pk', flat=True)

pk_list = list(pk_list)
print(type(pk_list))
print(pk_list)

出力結果

<class 'list'>

[55, 72, ・・・, 82]

今日のdot

forループを使わずコードを記述できるので1行のシンプルな表現になります。多くの場合こちらの方が処理速度を速くできるのでQuerySetから必要となるのが特定フィールド値のリスト形式である場合は今回の方法を積極的に利用しましょう。