今日現場でPythonのコードを書いてる時、少しDjangoのQuerySetについて理解が深まった気がしたのでメモします。
モデル名.objects.get()ではモデルのデータが取得できて、objects.filter()でQuerySet型でデータが取得できる
objects.filter()でモデルからデータを取得した後に、取得したモデル.フィールド名でデータにアクセスできると思ってましたがエラーになりました。
コードの内容としては以下のような感じでした。
data = ModelName.objects.filter(name=arg) print(data.name) // エラーになった
デバッガーを使ってobjects.filterで取得したデータの中身を確認したところQuerySet型になっていました。
おそらくfilter()は複数データを取得できる関数なのでQuerySetとしてデータが取得できるのかと推測してます。
QuerySetでデータを取得する場合はQuerySetから辞書型に変換するなどして、その後の処理でデータにアクセスできました。
こちらの記事が参考になりました。
また、ModelName.objects.get(pk=id)のようにget()を使ってデータを取得するとその後すぐにデータが持つ各フィールドにアクセスできました。
data = ModelName.objects.get(pk=arg) print(data.name) // dataモデルのnameフィールドの値が出力される
これはおそらくgetが特定の一意のデータを取得するからQuerySet型ではなくモデルが直接取得できているのかと推測してます。
このあたりの予想はまだ根拠になるドキュメントを見つけられていないので、公式ドキュメントを中心に調査してみたいと思います。