diadia

興味があることをやってみる。自分のメモを残しておきます。

django ManyToManyFieldを含むオブジェクトの操作

内容

ManyToManyFieldを含むモデルクラスオブジェクトの生成方法は3通りある。
確認した方法を記録しておく。

  1. 復習
  2. ManyToManyFieldを含むクラスオブジェクトを生成する

1. 復習

そもそもオブジェクトの生成法は??

基本的にオブジェクトの生成は、createメソッドを使って生成する方法とコンストラクタを使って生成する方法がある。

class Author(models.Model):
    name = models.CharField(max_length=60)
    country = models.CharField(max_length=60) 

#createメソッドで生成する方法
author_obj = Author.objects.create(name="三島由紀夫", country="日本")

#コンストラクタで生成する方法
author_obj = Author(name="三島由紀夫", country="日本")
author_obj.save()

createメソッドを実施する場合には、save()を使わなくても生成したオブジェクトをデータベースに登録する事ができる利点がある。

オブジェクトの内容を変更する

オブジェクトの内容を変更するには、オブジェクトのアトリビュート(属性)を再設定してあげれば良い。

class Author(models.Model):
    name = models.CharField(max_length=60)
    country = models.CharField(max_length=60) 

#createメソッドで生成する方法
author_obj = Author.objects.create(name="三島由紀お", country="日本")

#nameが間違っていたので修正する
author_obj.name = "三島由紀夫"
author_obj.save()

オブジェクトの要素を変更したら、save()メソッドを使って変更内容を確定する。

2. ManyToManyFieldを含むクラスオブジェクトを生成する

ManyToManyFieldを含むクラスオブジェクトを生成してからManyToManyFieldの内容を変更する方法がある。
この方法は、createメソッドやコンストラクタでまずオブジェクトを生成してから、add()メソッドやset()メソッドを使ってManyToManyFieldの中身を定める。

class Author(models.Model):
    name = models.CharField(max_length=60)
    country = models.CharField(max_length=60) 

class Book(models.Model):
    title = models.CharField(max_length=120)
    authors = ManyToManyField(Author)

#Bookオブジェクトを生成する 
book_obj   = Book.objects.create(title="潮騒")
#ManyToManyFieldの内容を取得または生成する
author_obj = Author.objects.create(name="三島由紀夫", country="日本")
#ManyToManyFieldの内容に設定する
author_obj.authors.set([author_obj])

set()メソッドを使った場合には、save()メソッドを使わなくともオブジェクトの変更が確定する。
set()メソッドを使わない方法としてadd()メソッドつ使う方法がある。

#Bookオブジェクトを生成する 
book_obj   = Book.objects.create(title="潮騒")
#ManyToManyFieldの内容を取得または生成する
author_obj = Author.objects.create(name="三島由紀夫", country="日本")
#ManyToManyFieldの内容に設定する
author_obj.authors.add(author_obj)

この方法もset()メソッドと同じくsave()メソッドを使わなくともオブジェクトの変更を確定できる。 このメソッドの注意点はManyToManyFieldのデータの追加設定であり、すでに登録してあるフィールドを削除することはない。

上記の方法は一度オブジェクトを生成してManyToManyFieldの中身を設定する方法である。
createメソッドで一気に生成する方法は無いと思われる。