1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Django】Exception Value: type object '' has no attribute '_meta'のエラー処理

Last updated at Posted at 2021-10-31

#はじめに
Djangoプロジェクト開発の際にタイトルにあるエラーに遭遇しました.本日はこのエラーメッセージの対処法について自分なりに勉強した内容を記事にしております.

※「とりあえずエラーが解消できれば良い!」という方は,この記事の途中は読み飛ばして「エラー処理方法」だけ読んで頂ければ解決できると思います.

#エラーの原因は?
このエラー文は**「モデルクラスに_meta属性があるはずなのに,どこにもない!」**と怒ってきています.
Djangoプロジェクト内で,モデルを参照することを前提として動いている機能を使う際に,そのモデルの参照が適切にできていないと,このように怒られるようです.

##_meta属性とは
_meta属性はDjango ORM(Object-relational mapping: オブジェクト関係マッピング)を中核を担うAPIです.Djangoプロジェクト内のモデル定義部分以外のシステムがモデルを参照する際に,参照したモデルのメタ情報も理解できるようになります._meta属性のオプションは様々ありますが,今回の主題とは逸れるので,興味のある方はドキュメントで詳細をご覧ください.

#エラー処理方法
Djangoプロジェクト内で下記のmodel = Hogehogeのようにモデル参照を行った際のhogehogeクラスがmodels.Modelを継承していないことがこのパターンの原因であると考えられます.

views.py
from django.views.generic import ListView
from .models import Hogehoge

class Example(ListView):
    template_name = 'example.html'
    model = Hogehoge # Hogehogeクラスをモデルとして参照する

上の例のようにモデルを参照する場合,Hogehogeクラスは当然モデルクラスである必要があります.

models.py(誤)
# これは間違っている例です
class Hogehoge(): # model.Modelの継承を忘れてる
    field_a = ...
models.py(正)
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 ドキュメント

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?