【DRF】M2Mを含むインスタンスをcreate()する時に出たエラー。
2022/6/21
2022/6/21
今回新しく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
最近の記事
![](/_next/image?url=https%3A%2F%2Fcraft-time.jp%2Fwp-content%2Fuploads%2F2023%2F11%2F%E7%94%BB%E5%83%8F%E4%BD%9C%E6%88%90-7.png&w=3840&q=75)
音楽生成AI「Suno」の使い方まとめ!作詞作曲が簡単にできる?
簡単に曲が作れるAIということでよく聞く「Suno(Chirp)」についてまとめました。
目次「Suno」とはテキストからさまざまな音声を生成する「Bark」歌詞から曲を生成する「Chirp」...
2023/11/24
2023/11/24
![](/_next/image?url=https%3A%2F%2Fcraft-time.jp%2Fwp-content%2Fuploads%2F2023%2F11%2F%E7%94%BB%E5%83%8F%E4%BD%9C%E6%88%90-5.png&w=3840&q=75)
【Open AI】APIの料金まとめ|GPT・DALL·E・Whisperなど
Open AIのAPI(一部)の料金をまとめました。
参考のために日本円は「1ドル150円」で換算をしています。
目次Text generation: テキスト生成Assistants ...
2023/11/22
2023/11/22
![](/_next/image?url=%2Fimages%2Fnoimage.png&w=3840&q=75)
【Next.js】Assistants APIの基本的なコードまとめ。
Open AIの「Assistants API」をNext.jsで使用する時の基本的なコードをまとめました。
目次Open AIのAPIセットアップ基本の使い方Threads: スレッドを作る...
2023/11/21
2023/11/21
![](/_next/image?url=https%3A%2F%2Fcraft-time.jp%2Fwp-content%2Fuploads%2F2023%2F11%2F%E7%94%BB%E5%83%8F%E4%BD%9C%E6%88%90-1-1.png&w=3840&q=75)
【Next.js】Open AIのAPIでファイルをアップロードする方法。
今回は、Next.jsサイトからOpen AIのAPI(Upload file)で、ファイルをアップロードする方法を実装するのに時間がかかったのでその過程と最終コードをまとめます。(Vercelにデ...
2023/11/21
2023/11/22
![](/_next/image?url=%2Fimages%2Fnoimage.png&w=3840&q=75)
「生成系AIのWEBプロダクトTOP50」をまとめてみる。
Andreessen Horowitzが出している記事で紹介されている「AIプロダクトの月間訪問者数ランキングTOP50」のサービスをまとめました。
目次ChatGPTcharacter.ai...
2023/10/3
2023/10/3
![](/_next/image?url=%2Fimages%2Fnoimage.png&w=3840&q=75)
【Next.js 13】NextAuth+FireStoreにユーザー情報を保存する。
今回は、以下の3つをNext.js 13で実装するためのメモです。
Googleアカウントでログインできる
アカウント、セッション情報をFirestoreに保存する
サーバーサイ...
2023/7/12
2023/7/12