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: &lt;classname> is missing a QuerySet. Define &lt;classname>.model, &lt;classname>.queryset, or override &lt;classname>.get_queryset(). 

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

対処法

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

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