Django ListViewで”classname is missing a QuerySet…”という例外が発生した時の対処法

ListViewを使っていると次の様な例外が発生する事があります。

<classname> is missing a QuerySet. Define <classname>.model, <classname>.queryset, or override <classname>.get_queryset().

この例外は、modelやqueryset変数を定義していなかったり、get_querysetメソッドをオーバーライドしていない場合に発生します。

今回はこの例外が発生する原因や対処法を詳しく解説します。

例外の発生原因

ListViewを使うときは次のコードの様に、model変数やqueryset変数を定義する必要があります。どちらか一方だけでも構いません。

from django.contrib.auth.models import User
from django.views.generic.list import ListView


class UserListView(ListView):
    model = User
    queryset = User.objects.all()

動的にquerysetを変更したい場合は、get_querysetメソッドをオーバーライドするだけでも問題ないです。

しかし、どれもmodel変数やqueryset変数を定義していなかったり、get_querysetメソッドをオーバーライドしていない場合は次の様な例外が発生します。

django.core.exceptions.ImproperlyConfigured: <classname> is missing a QuerySet. Define <classname>.model, <classname>.queryset, or override <classname>.get_queryset(). 

(翻訳)
<classname>にQuerySetがありません。<classname>.modelや<classname>.querysetを定義するか<classname>.get_queryset()をオーバーライドしてください。

対処法

次の2つの対処法が考えられます。

  • model変数やqueryset変数を定義する
  • get_queryメソッドをオーバーライドする
スポンサーリンク
スポンサーリンク