diadia

興味があることをやってみる。自分のメモを残しておきます。

django:adminページでインスタンスを検索する

adminでインスタンスの検索が必要になるケース

例えば運用しているアプリケーションのインスタンスに誤りがあるとする。このインスタンスを修正するためにadminから修正することになっていたとする。
この場合アドミンからインスタンスを選択し、修正を行う。しかしインスタンスが20,000件ほどあったらどうだろうか?検索できないとページを繰りながら該当インスタンスを探すことになる。200ページくらいページを繰りたいか?答えは否。

 

インスタンスを検索するフォームをアドミンに実装する

document:https://docs.djangoproject.com/ja/2.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.search_fields

検索フォームの実装はModelAdminを継承したクラスの属性にsearch_fieldsを定めてやるだけで終了する。

from django.contrib import admin
from products.models import Product


class ProductModelAdmin(admin.ModelAdmin):

	search_fields = ["productId"]
	


admin.site.register(Product, ProductModelAdmin)

このように書けば、新たにフォームがアドミンページに出現する。そしてproductidを打ち込むと、該当するインスタンスのみが抽出されるようになる。

この検索フォームの実装は前提条件がある。それは検索対象がCharFieldまたはTextFieldでことだ。
上記のフィールドではないフィールドを使って検索したい場合もある。その際は、クラス属性のlist_filterを使うと検索が可能になる。BooleanField、CharField、DateField、DateTimeField、IntegerField、ForeignKey、ManyToManyFieldであれば利用することができる。参考:https://docs.djangoproject.com/ja/2.2/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter