【Django】DRFでManyToManyフィールドを含むデータ更新でハマった点。
2022/6/21
2022/6/21
Django REST Frameworkを使って、ManyToManyフィールドを含むデータの更新をしようとしてハマったのメモ。
今回の課題
やりたいことは「投稿(Post)と一緒に、タグ(Tag: M2M)も更新すること」です。
ただ更新したいデータをDjango側で受け取った時に、validated_dataの「Tag」部分データが受け取れませんでした。
送信したデータ
{
"uuid":"af773f1b3184",
"title":"「HTTPリクエスト/HTTPレスポンス」って何?",
"tags":[
{"id": 2},
]
}
Djangoで受け取ったデータ(validated_data)
OrderedDict([
('tags', [OrderedDict()]),
('uuid', 'af773f1b3184'),
('title', '「HTTPリクエスト/HTTPレスポンス」って何?')
])
tagsのOrderedDict()
の中身が空になってしまっています…。
今回のコード
Models.py
from django.db import models
class Tag(models.Model):
name = models.CharField(blank=True, null=True, max_length=255)
class Post(models.Model):
uuid = models.CharField(blank=True, null=True, max_length=255)
title = models.CharField(blank=True, null=True, max_length=255)
tags = models.ManyToManyField("Tag", through="PostTagRelation", blank=True, null=True)
class PostTagRelation(models.Model):
post = models.ForeignKey("Post", on_delete=models.CASCADE)
tag = models.ForeignKey("Tag", on_delete=models.CASCADE)
Views
class PostUpdateView(generics.UpdateAPIView):
queryset = Post.objects.prefetch_related('tags').all()
serializer_class = PostUpdateSerializer
permission_classes = (AllowAny,)
lookup_field = 'uuid'
Serielizers
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = Tag
fields = '__all__'
class PostUpdateSerializer(serializers.ModelSerializer):
tags = TagSerializer(many=True)
class Meta:
model = Post
fields = '__all__'
解決法
TagSerializerのidをオーバーライドする(下記のように追記)ことで受け取ることができました。
TagSerializerのidがデフォルトでread_only = True
になっていたようで、validated_dataに含まれなかったようです。
class TagSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(label='id') # 追加(idをオーバーライド)
class Meta:
model = Post
fields = '__all__'
最近の記事
音楽生成AI「Suno」の使い方まとめ!作詞作曲が簡単にできる?
簡単に曲が作れるAIということでよく聞く「Suno(Chirp)」についてまとめました。
目次「Suno」とはテキストからさまざまな音声を生成する「Bark」歌詞から曲を生成する「Chirp」...
2023/11/24
2023/11/24
【Open AI】APIの料金まとめ|GPT・DALL·E・Whisperなど
Open AIのAPI(一部)の料金をまとめました。
参考のために日本円は「1ドル150円」で換算をしています。
目次Text generation: テキスト生成Assistants ...
2023/11/22
2023/11/22
【Next.js】Assistants APIの基本的なコードまとめ。
Open AIの「Assistants API」をNext.jsで使用する時の基本的なコードをまとめました。
目次Open AIのAPIセットアップ基本の使い方Threads: スレッドを作る...
2023/11/21
2023/11/21
【Next.js】Open AIのAPIでファイルをアップロードする方法。
今回は、Next.jsサイトからOpen AIのAPI(Upload file)で、ファイルをアップロードする方法を実装するのに時間がかかったのでその過程と最終コードをまとめます。(Vercelにデ...
2023/11/21
2023/11/22
「生成系AIのWEBプロダクトTOP50」をまとめてみる。
Andreessen Horowitzが出している記事で紹介されている「AIプロダクトの月間訪問者数ランキングTOP50」のサービスをまとめました。
目次ChatGPTcharacter.ai...
2023/10/3
2023/10/3
【Next.js 13】NextAuth+FireStoreにユーザー情報を保存する。
今回は、以下の3つをNext.js 13で実装するためのメモです。
Googleアカウントでログインできる
アカウント、セッション情報をFirestoreに保存する
サーバーサイ...
2023/7/12
2023/7/12