BETA

[Django] ManyToManyField はそのままでは iterable ではない

投稿日:2018-11-19
最終更新:2018-11-19

概要

Django で ManyToManyField を使って定義されたフィールドはそのままでは iterable ではないので、for 文とか使うときは iterable に変換しないといけないという話。

■環境
・Python3.6
・Django2.1

詳細

例えば以下のようなモデルを定義する。

from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=30)

class Book(models.Model):
    title = models.CharField(max_length=30)
    categories = models.ManyToManyField(Category)

このモデルに対して

list = []
categories = Book.objects.get(id=1).categories
for category in categories:
    list.append(category)

とかすると下記のように怒られる。

argument of type 'ManyRelatedManager' is not iterable

ManyToManyField はそのままでは iterable ではないらしい。
こういう場合は後ろに all() をつけてやると iterable に変換されて上手くいく。

list = []
categories = Book.objects.get(id=1).categories
for category in categories.all():
    list.append(category)

参考ページ

ManyRelatedManager not Iterable. Think I'm trying to pull my objects out incorrectly

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@shibbの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう