DjangoBrothers BLOG ✍️

2019/08/10

このエントリーをはてなブックマークに追加
Django Admin ForeignKey

ForeignKeyモデルのフィールドをAdmin画面のlist_displayに追加する

外部キーで参照しているモデルのフィールド情報をAdmin画面で表示する方法です。

以下のようなmodels.pyがあったとして、BookモデルのAdminでAutherのageフィールドを表示できるようにします。

models.py

from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    age = models.PositiveIntegerField()

    def __str__(self):
        return self.name

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey('Author', on_delete=models.CASCADE)

    def __str__(self):
        return self.title

admin.pyで、author_ageというメソッドを作り、それをlist_diaplayに追加することでAuthorの年齢を表示できます。

admin.py

from django.contrib import admin
from .models import Book

class BookAdmin(admin.ModelAdmin):
    list_display = ('id', 'title', 'author', 'author_age')
    list_display_links = ('id', 'title')

    def author_age(self, obj):
        return obj.author.age
    author_age.short_description = '著者の年齢'
    author_age.admin_order_field = 'author__age'

admin.site.register(Book, BookAdmin)

author_ageメソッドは、objという引数名でBookモデルインスタンスを受け取っています。 obj.author.ageのようにすることで、外部キーで参照しているAuthorモデルのフィールドにアクセスできます。

  • short_description - 表示されるカラムのタイトルをカスタマイズします
  • admin_order_field - 紐づいたモデルでソートできるようにしたい場合に指定します

参考