【Django】QuerySet, Object has no attribute ‘hoge’エラーの対処

django

タイトルのエラーが発生して、あれ?と思った時に凡ミスをしていたことに気付いたので備忘録を兼ねて、オブジェクトのgetメソッド、filterメソッドのおさらい。

何をしていてエラーが発生したのか

あるモデルでプライマリーキー1のオブジェクトを取得して、それをテンプレートで展開しようとしていました。

post = Post.object.filter(pk=1)

で、変数postに入っている情報は単体なので、以下のようにテンプレートで記述しました。

{{ post.title}}
{{ post.image }}

しかし、表示されず。

shellで確認してみると、

QuerySet, Object has no attribute 'post'

のエラーが。pk=1のオブジェクトは1つしかないので単体で取得した気になっていたのですが、filterメソッドで取得した時にはリストで返ってくるので上記エラーが発生しました。

allメソッドで取得した時のようにこのように記述しないといけませんでした。

{% for post in post %}
    {{ post.title }}
{% endfor %}

 

単体のオブジェクトを取得する時はgetメソッドを使う

完全に凡ミスなのですが、単体のオブジェクトを取得する時にはgetメソッドを使います。

post = Post.objects.get(pk=1)

これであれば、テンプレートで以下のように記述できます。

{{ post.title}}
{{ post.image }}

 

まとめ

allやfilterでは例え取得結果が1件でもリストで返ってくるので、1件の取得が確定している場合はgetメソッドを使う。



カテゴリー