ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
基本
Article.objects.order_by("created_at") # 昇順(古い順)
Article.objects.order_by("-created_at") # 降順(新しい順)
# 複数キー: 点数の高い順、同点なら名前の五十音順
Article.objects.order_by("-score", "title")
# 発行される SQL
print(Article.objects.order_by("-created_at").query)
# SELECT ... FROM "blog_article" ORDER BY "blog_article"."created_at" DESC
マイナスはフィールド名の直前に付けます。order_by("created_at DESC") のように SQL のキーワードを書くと FieldError になります。
並び順を後から変える・消す
qs = Article.objects.filter(published=True)
qs = qs.order_by("-created_at") # 追加ではなく「置き換え」
qs = qs.order_by("title") # 前の指定は消え、title 順になる
qs.reverse() # 指定済みの並びを逆にする
qs.order_by() # 並び順をすべて解除する
order_by() は累積しません。2 回呼んだら後の指定だけが残ります。段階的に組み立てたい場合はリストにためて最後に一度だけ渡します。
order = []
if sort_by_score:
order.append("-score")
order.append("-created_at")
qs = Article.objects.order_by(*order)
モデルの既定の並び順
class Article(models.Model):
title = models.CharField(max_length=200)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
ordering = ["-created_at"] # 何も指定しなければこの順
Meta.ordering を付けると、すべてのクエリに ORDER BY が付きます。件数が多いテーブルでは、意図しないソートが性能に効いてくることがあります。
集計と組み合わせるときは特に注意が必要です。
from django.db.models import Count
# Meta.ordering のフィールドが GROUP BY に混ざり、結果が分かれてしまう
Article.objects.values("author").annotate(n=Count("id"))
# 集計の前に並び順を解除する
Article.objects.order_by().values("author").annotate(n=Count("id"))
リレーション先で並べる
Article.objects.order_by("-author__age") # 著者の年齢の降順
Article.objects.order_by("author__name", "-score") # 著者名順、同著者内は点数降順
# JOIN が増えるので select_related と併用する
Article.objects.select_related("author").order_by("-author__age")
アンダースコア 2 個でリレーションをたどります。1 個だとフィールド名として解釈され FieldError: Cannot resolve keyword になります。
集計値・計算値で並べる
from django.db.models import Count, F, Value
from django.db.models.functions import Coalesce, Lower
# コメント数の多い順
Article.objects.annotate(n=Count("comments")).order_by("-n")
# 計算した値で並べる
Article.objects.annotate(rate=F("likes") * 100 / F("views")).order_by("-rate")
# 大文字小文字を無視して並べる
Article.objects.order_by(Lower("title"))
# NULL を 0 として扱う
Article.objects.order_by(Coalesce("score", Value(0)).desc())
NULL の位置を制御する
from django.db.models import F
Article.objects.order_by(F("published_at").desc(nulls_last=True))
Article.objects.order_by(F("published_at").asc(nulls_first=True))
| DB | 既定の NULL の位置(昇順) |
|---|---|
| PostgreSQL | 最後 |
| MySQL / MariaDB | 最初 |
| SQLite | 最初 |
開発が SQLite で本番が MySQL といった構成では、同じコードでも並びが変わります。nulls_last を明示すれば揃います。
ランダム・件数制限との組み合わせ
Article.objects.order_by("?")[:5] # ランダム 5 件(大量データでは重い)
Article.objects.order_by("-created_at")[:10] # 新着 10 件
Article.objects.order_by("-created_at")[10:20] # 11〜20 件目
Article.objects.latest("created_at") # 最も新しい 1 件
Article.objects.earliest("created_at") # 最も古い 1 件
スライスした後は order_by() や filter() を呼べません(Cannot filter a query once a slice has been taken.)。絞り込みと並べ替えを済ませてから最後にスライスします。件数制限の詳細は limit, offsetの指定方法 を参照してください。
大量データで遅いとき
class Article(models.Model):
created_at = models.DateTimeField(db_index=True) # 単一キー
class Meta:
indexes = [
models.Index(fields=["-created_at", "id"]), # 複合+降順
]
ORDER BY に使う列にインデックスが無いと、DB は毎回すべての行を並べ替えます。並び順とインデックスの順序を一致させるのが基本です。実際に効いているかは qs.explain() で確認できます(SQLのログ出力方法)。
関連
- データベースへの接続と操作 — 親カテゴリ
- filterの検索オプション
- limit, offsetの指定方法
- SELECT, INSERT, UPDATE, DELETE
- SQLのログ出力方法
- 素のSQLを直接実行する方法
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- 【django】ログイン 認証機能 2026-09-08 03:22:09
- MySQL ERROR 1063 Incorrect column specifier for column|原因と直し方 2026-09-08 03:11:09
- 【PHPエラー】Object of class stdClass could not be converted to string 2026-09-07 07:46:04
- Julia Genie ローカル開発サーバ起動完全ガイド 2026-09-07 07:46:04
- Wi-Fi とは|規格と世代(Wi-Fi 4〜7)・周波数帯・CSMA/CA・WPA3 NEW 2026-09-07 07:45:13
- set コマンドでシェルオプションと位置パラメータを操作 | bash 2026-09-07 07:45:13
- JPEG(.jpg/.jpeg)画像形式の完全ガイド — 仕様・マジックナンバー・他形式との比較・EXIF 2026-09-07 07:45:13
- UE5 Get Overlapping Actorsで特定クラスだけ処理|Class Filter・Cast To 2026-09-07 07:45:13
- Linuxで特定拡張子のファイルを再帰削除|find -deleteの安全手順 2026-09-07 07:45:13
- Django CBVでテンプレートに値を渡す|get_context_data・extra_context 2026-09-07 07:45:13
- Linuxで複数ファイルの文字列を一括置換|find・sed・xargsの安全手順 2026-09-07 07:45:13
- Laravelルートグループ|prefix・middleware・nameで一括管理 2026-09-07 07:45:13
- Linux whichコマンドの使い方|絶対パス取得とtype・command -vの違い 2026-09-07 07:45:13
- Linux catコマンドの使い方|行番号表示・複数ファイル連結 2026-09-07 07:45:13
- unable to execute 'gcc': No such file or directory 2026-09-07 07:45:13
コメントを削除してもよろしいでしょうか?