ManyToManyFieldなどでよく見かけるannotate。サンプルコードを見ても何となくイメージがわきづらいですよね。
annotateを理解するのは結構大変ですが、具体例とともに順を追ってみていけばしっかりと理解ができるようになります。
そこで今回は、annotateの使い方について詳しく解説していきます。
annnotateは他のモデルの数を数えるときに使われます
一言で言うと、annotateは他のモデルの数を数えるときに使われます。
annotateは「注釈をつける」という意味ですので、補足情報を追加するというイメージを持つと良いかもしれません。
今回は、歌手と歌の2つのモデルを使ってannnotateを理解していこうと思います。
まずは図を使ってイメージをふくらませましょう。以下の図をご覧ください。
annotateは、歌手モデルで特定の歌手をピックアップし、その歌手が出した歌の数をannotateを使って抽出するというイメージです。
このイメージを持ちながら、実際にコードを書いて理解を深めていきましょう。
モデルを2つ作ります
モデルを2つ作っていきましょう。上記の通り、あるモデルをもとに違うモデルの数を数えますので、モデルを2つ作らないと意味がないということだけ、何となく頭に入れておいてください。
1. Singerモデル
まずはSingerモデルです。
歌手名と、その歌手のデータを入れていきましょう。
歌手名 | デビュー年 | メンバー数 |
サザンオールスターズ | 1974年 | 5名 |
SMAP | 1991年 | 5名 |
Superfly | 2004年 | 2名 |
2. Songsモデル
次に。曲名が書かれたモデルを作ります。
ちょっと年がばれそうですが、、個人的に印象が残った曲を中心にモデルを作っていきます。
曲名 | 歌手名 |
みんなのうた | サザンオールスターズ |
らいおんハート | SMAP |
勝手にシンドバッド | サザンオールスターズ |
愛をこめて花束を | Superfly |
世界に一つだけの花 | SMAP |
Triangle | SMAP |
実際にコードを書いていきましょう。まずはモデルの作成です。
コードclass Singer(models.Model):
name = models.CharField(max_length=100)
debut = models.IntegerField()
member = models.TextField()
class Songs(models.Model):
song = models.TextField()
singer = models.Foreignkey(Singer, on_delete=models.CASCADE)
次に、annotateを使ったコードを書いていきましょう。
コード-views.py
1 from .models import Count
2 from django.http import HttpResponse
3 def songcount(request):
4 annotated_singers = Singer.objects.annotate(number_of_songs=Count('songs'))
5 print(annotated_singers)
6 return HttpResponse('')
コードの解説(1) 4行目に注目してください。annotated_singersという変数を作っていますが、この変数に入れている情報は、SingerモデルのSongsモデルの数です。
SongsはForeignKeyでSingerモデルと紐づいていますので、一つ一つのsongsオブジェジェクトは、Singerモデルのいずれかのオブジェクトに含まれることになります。
このコードを実行すると、print関数でannotated_singersが出力されるのですが、出力される結果は以下の通りです。
アウトプット<QuerySet [<Singer: サザンオールスターズ>, <Singer: SMAP>, <Singer: Superfly>]>
これは、annotateされた状態でQuerysetとしてデータが作成された状態です。
これでは歌手毎の歌の数が分かりませんので、歌の数を出力していきましょう。
print(annotate_singers)の部分をprint(annotated_singers[0].number_of_songs)に変えます。
ここで、annotated_singers[0]はQuerysetの最初のデータ、すなわちサザンオールスターズを示しています。
そして、number_of_songs属性にsongsの数(すなわち、サザンオールスターズの歌の数)が入っていますので、上記のコードで出力することにより、サザンオールスターズの歌の数が出力されます。
出力結果は以下のようになります。
アウトプット2
このように、関連付けられたモデルの数を数えることができますので、ぜひannotateの使い方をマスターしましょう。
annotateのまとめ
(1) annotateは2つのモデルで関連付けられたデータを数える時に使う
(2) イメージは、歌手と歌手名の関係
(3) annotateメソッドを使うことで、任意の属性に指定したデータの数を格納することができる
~Django無料講義~のご案内
Code for Djangoが、4時間超の無料Django講義をはじめました
- ・本を出版したCode for Djangoの 製作者が作ったサイトです。
- ・Code for Djangoの内容も、 動画で詳しく解説しています。
- ・動画は順次ふやしていきますので、 ただで学び続けることが可能です。
- ・Djangoの効率的なスキルアップに、 是非お役立て下さい。