【DRF】M2Mを含むインスタンスをcreate()する時に出たエラー。

今回新しくManyToManyフィールド(Tag)を含む投稿(Post)インスタンスを作成しようとしたところエラーが出たのでその解消法メモ。

M2M含むインスタンス作成時に出たエラー

実行したこと

class Tag(models.Model):
    name = models.CharField(blank=True, null=True, max_length=255)

class Post(models.Model):
    title = models.CharField(blank=True, null=True, max_length=255)
    tags = models.ManyToManyField("Tag", through="PostTagRelation", blank=True, null=True)
def create(self, validated_data):
    # 1: validated_dataからtagsを取り出す処理
    tags_data = self.validated_data.pop('tags')

    # 2: Postインスタンスを作成する処理
    post = Post.objects.create(**validated_data)
    
    # 3: tagsを一つずつPostへ追加する処理
    for tag_data in tags_data:
        tag_qs = Tag.objects.filter(id=tag_data['id'])
        if tag_qs.exists():
            tag = tag_qs.first()
        else:
            tag = Tag.objects.create(**tag_data)
			post.tags.add(tag)

    post.save()
    return post

実際のエラー文

TypeError: Direct assignment to the forward side of a many-to-many set is prohibited. Use tags.set() instead.

解決法

def create(self, validated_data):
    # 1: validated_dataからtagsを取り出す処理
    tags_data = self.validated_data.pop('tags')

    # 2: Postインスタンスを作成する処理
    post = Post.objects.create(
        title=validated_data.get('title'),  # 追加: フィールドを指定
    )

    # 3: tagsを一つずつPostへ追加する処理
    for tag_data in tags_data:
        tag_qs = Tag.objects.filter(id=tag_data['id'])
        if tag_qs.exists():
            tag = tag_qs.first()
        else:
            tag = Tag.objects.create(**tag_data)
			post.tags.add(tag)

    post.save()
    return post