【Django】order_byメソッドによるソート方法:降順や複数条件によるソート

2023.05.24 /

【Django】order_byメソッドによるソート方法:降順や複数条件によるソート

記事ではDjangoにおける、order_byメソッドによるソート方法について解説していきます。

作成しているWebアプリケーションで、データベースから取得したデータをソートしたい場面は多々あります。昇順や降順複数条件によるソートなどソートをするにもいくつか種類が存在します。

Djangoにはソート用のメソッドとしてorder_byメソッドが用意されています。本記事を通して、order_byメソッドの使い方について理解を深めてください。

Djangoの基本的な使い方については以下記事を参考にしてください。

Django:order_byメソッドの使い方

order_byメソッドはクエリセットをソートするためのメソッドです。

Django用語の確認

クエリセット(QuerySet)とはクエリ(Query)によってデータベースから取得したデータリストのことです。クエリ(query)とは、DBMS(データベース管理システム)に対して取得・追加・更新などの処理を要求するための記述方です。Djangoのデータベース操作については以下記事を参考にしてください

views.pyでデータベース操作(取得・作成・更新・削除)を行う場合は基本的に以下クエリの構文を使用します。

クエリの基本構文

モデルクラス.マネージャー.メソッド()

上記クエリより取得したデータリスト(QuerySetクエリセット)にorder_byメソッドを使用することでデータをソートできます。

order_byメソッドは以下構文に従って使用します。

order_byメソッドの構文

order_by(field)

引数のfieldには対象のモデルクラスのフィールドを指定します。指定したフィールドを元にソートを行います。

例えばモデルクラスTaskからすべてのデータを取り出し、フィールドdateで昇順にソートするには以下のようにコードを記述します。

Task.objects.order_by('date')

order_byメソッドの引数に単にフィールド名を指定した場合は昇順でソートされます。

降順でソートする方法

クエリセットのデータを降順にソートする方法としてDjangoには以下の方法が用意されています。

  • 引数のフィールド名の前に「-」を付ける
  • reverse()メソッドを使用する

引数のフィールド名の前に「-」を付ける

order_byメソッドの引数で指定するソート元にとなるフィールド名の前に「-」を付けることで降順ソートになります。

Task.objects.order_by('-date')

reverse()メソッドを使用する

order_by()メソッドに続けてreverse()メソッドを使用することで降順ソートになります。

Task.objects.order_by('date').reverse()

order_by():複数条件によるソート方法

複数のフィールドでソートをしたい場合は、カンマで区切ってorder_byメソッドの引数に複数のフィールドを指定します。

例えばフィールドdateで降順ソートして、フィールドnameで昇順ソートする場合は次のように記述します。

Task.objects.order_by('-date', 'name',)

order_by():ランダムに並べる

order_byメソッドの引数に「?」を指定することで、クエリセットによるデータリストをランダムに並べることができます。

Task.objects.order_by('?')