【保存版】Django: モデルの表示順序を自在に操る!admin.ModelAdmin.orderingと代替方法をマスターしよう


admin.ModelAdmin.ordering は、Django 管理画面におけるモデルオブジェクトの表示順序を決定する属性です。これは、モデルの Meta クラス内の ordering 属性とは異なり、管理画面でのみ適用されます。

使い方

admin.ModelAdmin.ordering は、リスト形式で表示されるモデルオブジェクトの順序を指定するために使用されます。この属性には、モデルフィールドの名前をカンマ区切りでリストする必要があります。デフォルトの順序は昇順ですが、フィールド名の前に - を付けることで降順に並べ替えることができます。

from django.contrib import admin

from .models import MyModel

class MyModelAdmin(admin.ModelAdmin):
    ordering = ('-created_at', 'name')  # 最新のものから古いものへ、名前順に並べ替え

上記の例では、MyModel オブジェクトは、作成日時が新しい順に、その後に名前順に並べ替えられます。

詳細

admin.ModelAdmin.ordering 属性は、以下の点に注意する必要があります。

  • 関係のないフィールドを指定すると、エラーが発生します。
  • ForeignKey フィールドの場合は、関連するモデルの名前を . で区切って指定する必要があります。
  • 複数のフィールドを指定する場合は、カンマ区切りでリストする必要があります。
  • フィールド名の前に - を付けることで降順に並べ替えることができます。
  • モデルフィールドの名前を指定する必要があります。

admin.ModelAdmin.ordering 属性は、モデルオブジェクトをリスト形式で表示する場合にのみ適用されます。詳細表示ページや編集ページでの表示順序には影響しません。



モデルと管理クラス

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=255)
    email = models.EmailField()

class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    publication_date = models.DateField()
from django.contrib import admin

from .models import Author, Book

class AuthorAdmin(admin.ModelAdmin):
    list_display = ('name', 'email')
    search_fields = ('name', 'email')

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'publication_date')
    list_filter = ('author', 'publication_date')
    ordering = ('-publication_date', 'title')  # 最新の書籍から古い書籍へ、タイトル順に並べ替え

admin.site.register(Author, AuthorAdmin)
admin.site.register(Book, BookAdmin)
  • BookAdmin

    • list_display 属性: 一覧画面に表示するフィールドを指定
    • list_filter 属性: フィルター条件として使用できるフィールドを指定
    • ordering 属性: オブジェクトの表示順序を指定
  • AuthorAdmin

    • list_display 属性: 一覧画面に表示するフィールドを指定
    • search_fields 属性: 検索対象とするフィールドを指定
  • Bookモデル

    • title フィールド: 書籍のタイトル
    • author フィールド: 著者 (Authorモデルへの外部キー)
    • publication_date フィールド: 出版日
    • name フィールド: 著者名
    • email フィールド: 電子メールアドレス

この例では、BookAdmin クラスの ordering 属性を使用して、書籍オブジェクトを以下の順序で表示するようにしています。

  1. 最新の出版日付のものから古い出版日付のものへ
  2. 同じ出版日付の場合は、タイトル順に

この設定により、管理画面で書籍を一覧表示する際に、最新の書籍から古い書籍へと順番に表示され、同じ出版日付の場合はタイトル順に表示されます。

上記のコードはあくまでも一例であり、状況に合わせて様々なカスタマイズを行うことができます。

例えば、以下のようなカスタマイズが可能です。

  • ランダムに並べ替える
  • カスタムクエリを使用して並べ替える
  • 関連モデルのフィールドを使用して並べ替える


カスタムマネージャーを使用する

カスタムマネージャーを使用して、モデルオブジェクトを独自の基準で取得することができます。 この方法は、複雑なソート条件やフィルター条件が必要な場合に有効です。


from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    publication_date = models.DateField()

    def get_latest_books(self):
        return Book.objects.filter(publication_date__gte=F('publication_date') - datetime.timedelta(days=30)).order_by('-publication_date', 'title')

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'publication_date')
    list_filter = ('author', 'publication_date')
    queryset = Book.objects.all()  # デフォルトのマネージャーを使用

    def get_queryset(self, request):
        return self.get_latest_books()  # カスタムマネージャーを使用

利点

  • 再利用可能なマネージャーを作成できる
  • 複雑なソート条件やフィルター条件を柔軟に定義できる

欠点

  • 管理画面の設定画面から直接カスタマイズできない
  • admin.ModelAdmin.ordering よりも記述量が多くなる

カスタムビューを使用する

カスタムビューを使用して、モデルオブジェクトを独自のテンプレートで表示することができます。 この方法は、高度なカスタマイズが必要な場合に有効です。


from django.shortcuts import render

from .models import Book

def latest_books(request):
    books = Book.objects.filter(publication_date__gte=F('publication_date') - datetime.timedelta(days=30)).order_by('-publication_date', 'title')
    return render(request, 'latest_books.html', {'books': books})
from django.urls import path

from .views import latest_books

urlpatterns = [
    path('latest_books/', latest_books, name='latest_books'),
]

利点

  • テンプレートエンジンを使用して自由に表示をデザインできる
  • 高度なカスタマイズが可能

欠点

  • 管理画面の機能の一部が利用できない可能性がある
  • admin.ModelAdmin を使用するよりも複雑になる

サードパーティ製ライブラリを使用する

django-admin-bootstapdjango-grappelli などのサードパーティ製ライブラリは、管理画面の表示をカスタマイズするための機能を提供しています。これらのライブラリは、admin.ModelAdmin.ordering の代替手段として使用できる機能を備えている場合があります。

利点

  • 追加機能が提供されている場合がある
  • 管理画面の外観と動作を簡単にカスタマイズできる

欠点

  • ライブラリのバージョンアップに追従する必要がある
  • 導入や設定にコストがかかる

管理画面設定を使用する

Django 3.1 以降では、admin.site.register デコレータの ordering 引数を使用して、管理画面全体の設定を変更することができます。


from django.contrib import admin
from .models import Book

admin.site.register(Book, ordering='-publication_date', title='書籍')

利点

  • 設定ファイルを変更するだけで簡単に設定できる
  • 特定のモデルだけでなく、管理画面全体の設定を変更できる

欠点

  • Django 3.1 以降でのみ使用可能
  • 個々のモデルごとに異なる設定を適用できない

admin.ModelAdmin.ordering は、多くの場合において便利な属性ですが、状況によっては代替手段が必要になる場合があります。 上記で紹介した代替方法はそれぞれ利点と欠点があるため、要件に合わせて最適な方法を選択してください。

  • ドキュメント: 使用している代替方法について十分にドキュメント化しておくことが重要です。
  • 保守性: コードがわかりやすく、将来変更しやすいようにすることが重要です。
  • 性能: 複雑なソート条件やカスタムクエリを使用すると、パフォーマンスに影響を与える可能性があります。