#はじめに
Djangoプロジェクト開発の際にタイトルにあるエラーに遭遇しました.本日はこのエラーメッセージの対処法について自分なりに勉強した内容を記事にしております.
※「とりあえずエラーが解消できれば良い!」という方は,この記事の途中は読み飛ばして「エラー処理方法」だけ読んで頂ければ解決できると思います.
#エラーの原因は?
このエラー文は**「モデルクラスに_meta属性があるはずなのに,どこにもない!」**と怒ってきています.
Djangoプロジェクト内で,モデルを参照することを前提として動いている機能を使う際に,そのモデルの参照が適切にできていないと,このように怒られるようです.
##_meta属性とは
_meta属性はDjango ORM(Object-relational mapping: オブジェクト関係マッピング)を中核を担うAPIです.Djangoプロジェクト内のモデル定義部分以外のシステムがモデルを参照する際に,参照したモデルのメタ情報も理解できるようになります._meta属性のオプションは様々ありますが,今回の主題とは逸れるので,興味のある方はドキュメントで詳細をご覧ください.
#エラー処理方法
Djangoプロジェクト内で下記のmodel = Hogehoge
のようにモデル参照を行った際のhogehogeクラスがmodels.Model
を継承していないことがこのパターンの原因であると考えられます.
from django.views.generic import ListView
from .models import Hogehoge
class Example(ListView):
template_name = 'example.html'
model = Hogehoge # Hogehogeクラスをモデルとして参照する
上の例のようにモデルを参照する場合,Hogehogeクラスは当然モデルクラスである必要があります.
# これは間違っている例です
class Hogehoge(): # model.Modelの継承を忘れてる
field_a = ...
from django.db import models
class Hogehoge(models.Model): # model.Modelの継承をしっかりしてやる
field_a = ...
※views.pyはあくまで例であり,formsなど他のシステムでも同じようにmodel = Hogehoge
と参照する部分では同じようにエラーが出ると思います.
このパターンは,私がやらかした凡ミスを基にしていますが,これとは別に継承クラスの名前を間違えてしまった方やモデルクラスの定義はできていたが,そのクラスを通常のクラスとして再定義してしまった方もいました.
#最後に
今までは時間のなさを理由にして,発生したエラーに対して深く調べることはあまりありませんでした.しかし,その場で解決するだけではなくできるだけ調べるクセをつけるために今回の記事を書きました.
至らない部分が多いとは思いますが,「ここ違うよ!」と感じた方がいらっしゃれば是非ご指摘頂けますと幸いです.
※ご意見や疑問点などお待ちしております!
#参照
Django: model object “has no attribute '_meta'” in class based view
AttributeError: type object 'Team' has no attribute '_meta'
Model _meta API | Django documentation
Django データベース操作 についてのまとめ
オブジェクト関係マッピング - Wikipedia
Model Meta Options | Django ドキュメント