【Django】データベースからソートして値を取得する方法

Web

こんにちは!ゆーや(@yuyamanm118712)です。

Djangoでは、データベースから取得したデータを柔軟に操作することが可能です。特に、データを特定の順序で表示することがよくあります。たとえば、ブログの記事を公開日時の降順で表示したり、ユーザーリストを名前順に並べたりするケースが考えられます。

この記事では、Djangoでデータベースからソートして値を取得する方法について、基本から応用までを詳しく解説します。

ゆーや
ゆーや

Webアプリを作成するにはDjangoがオススメ!

Djangoの開発環境が作りたい!という方は次の記事を見てね!

事前準備

データの準備とデータを画面に表示するまで

ゆーや
ゆーや

今回は画像のようなデータを用意しました!

事前の準備は以下の記事を参考にしてね!

データベースからソートして値を取得する方法

基本的なソート order_by()

単純な昇順・降順ソートは、以下のように実装します。

from django.shortcuts import render
from django.views.generic import ListView
# モデルSampleをインポート
from .models import Sample

class IndexView(ListView):
    template_name = "index.html"
    context_object_name = "records"

    # 整数で「降順」に並べる場合
    queryset = Sample.objects.order_by('-integer_field')

    # 整数で「昇順」に並べる場合
    # queryset = Sample.objects.order_by('integer_field')
ゆーや
ゆーや

order_by(‘フィールド名’)でソートが可能!

フィールド名の頭に「-」をつければ「降順」、つけなければ「昇順」になるので

試してみてね!(画像は降順だよ!)

複数フィールドでソート

実際のアプリ開発では、3つ4つのソートは当たり前なので、複数の場合も見ておきましょう!

「True/False」で並べたうえで、「ID」で並べてみましょう!

from django.shortcuts import render
from django.views.generic import ListView
# モデルSampleをインポート
from .models import Sample

class IndexView(ListView):
    template_name = "index.html"
    context_object_name = "records"

    # 複数フィールドで並び変える
    queryset = Sample.objects.order_by('-boolean_field', 'id')
ゆーや
ゆーや

True/Falseが第一ソートとしてTrue→Falseの順で並んだうえで、

IDが昇順で並んでいるのがわかるね!

【応用】Metaクラスでソート

こちらは少し応用で、「データを取得するときにデフォルトで並び順を指定する方法」になります!

views.pyは、以下のようにただただ全件取得するようにしておきます。

from django.shortcuts import render
from django.views.generic import ListView
# モデルSampleをインポート
from .models import Sample

class IndexView(ListView):
    template_name = "index.html"
    context_object_name = "records"

    # ソートせず、全件取得
    model = Sample

models.pyで、デフォルトのソートをつけたいModelを以下のように修正します。

from django.db import models

# Create your models here.
class Sample(models.Model):
    text_field = models.TextField(
        verbose_name="テキスト"
    )

    boolean_field = models.BooleanField(
        verbose_name="True/False"
    )

    integer_field = models.IntegerField(
        verbose_name="整数"
    )

    datetime_field = models.DateTimeField(
        verbose_name="日時"
    )
    # Metaクラスを作成 
    class Meta:
        ordering = ['-boolean_field']
ゆーや
ゆーや

全件取得しただけにも関わらず、True/Falseでソートがかかっていることがわかります!

(通常ならIDの昇順で並ぶはず!)

【応用】クエリパラメータで動的にソート

IF文と組み合わせることで、よく見る並び替え機能を実装することができます!

from django.shortcuts import render
from django.views.generic import ListView
# モデルSampleをインポート
from .models import Sample

class IndexView(ListView):
    sort_id = 1

    if sort_id == 1:
        sort_by = "integer_field"
    elif sort_id == 2:
        sort_by = "boolean_field"
    else:
        sort_by = "id"

    template_name = "index.html"
    context_object_name = "records"

    # sort_byを条件にソート
    queryset = Sample.objects.order_by(sort_by)
ゆーや
ゆーや

sort_idによる分岐でソートの条件を変更できるようにしました!

実際に変えて試してみてね!

本来はリクエストパラメータなどでsort_idを管理するといいよ!

もし、困ったら…

ゆーや
ゆーや

必要な個所だけ確認してね!

プロジェクト・アプリの作り方って…

デフォルトページじゃなくて、アプリのトップページを表示したいときって…

データの追加の仕方がわからない…

まとめ

Djangoでのデータのソートは、order_by()メソッドやMetaクラスのordering属性を使うことで、非常にシンプルに実装できます。また、動的にソート順を変更する方法や、管理画面でのソート設定についても紹介しました。

これらのテクニックを活用すれば、ユーザーにとって見やすく整理されたデータ表示を実現できます。ぜひ、実際のプロジェクトで試してみてください。

コメント

タイトルとURLをコピーしました