ManyToManyFieldの追加や削除

Python3.5、Django1.9で多対多のリレーションの要素の追加をadminの管理画面からではなく、コードを書いて行いたかったので頑張りました。

class Author(modesl.Model):


class Article(models.Model):
  authors = models.ManyToManyField(Author)

このようにしてリレーションを設定します。片方だけで十分です。どっちにやるのがいいかは難しいです。データベースに詳しい人に聞きましょう。

ar1 = Article.objects.get(id=1)
ar1.authors.all()
au1 = Authors.objects.get(id=1)
au1.article_set.all()

明示的にリレーションを書いた方は書いたattributeでアクセスできますが、もう片方は自動的に相手のクラス名_setというattributeが生成されます。

au1 = Authors.objects.filter(id=1)
au1.article_set.all()

とやってよく怒られます。filterが返すのはQuerySetです。

au1.article_set.add(ar1)

で追加することができます。リレーションの設定を間違えていて逆のほうが自然かもしれないですね。

au1.article_set.remove(ar1)

で削除ができます。

管理画面から追加したりするのはめんどくさいのでプログラムから操作できるとうれしいですよね。