こんにちは!ゆーや(@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属性を使うことで、非常にシンプルに実装できます。また、動的にソート順を変更する方法や、管理画面でのソート設定についても紹介しました。
これらのテクニックを活用すれば、ユーザーにとって見やすく整理されたデータ表示を実現できます。ぜひ、実際のプロジェクトで試してみてください。
コメント