私はこのAPIを設定しようとしていますので、 "PUT"を使ってモデル "MOVIE"のアイテムの1つまたは多くの "TAG"を更新できます。タグはMOVIEのM2Mです。私は映画のアイテムのPKに投稿しています。DjangoのRestでManyToManyフィールドを更新する
私のhttpieの仕事(200OKを返します)は何も作成されません。 JSON全体(フェッチを使用して)を投稿すると、MOVIE(link)にはTAGは作成されますが、M2Mの関係は作成されません。
httpie
http -f PUT http://localhost:8000/api/Edit/3/ tag:='{"name": "TEST"}'
Models.py
class Tag(models.Model):
name = models.CharField("Name", max_length=5000, blank=True)
taglevel = models.IntegerField("Tag level", null=True, blank=True)
class Movie(models.Model):
title = models.CharField("Whats happening?", max_length=10000, blank=True)
tag = models.ManyToManyField('Tag', blank=True)
Serializers.py
class Tag1Serializer(serializers.ModelSerializer):
class Meta:
model = Tag
fields = ('name',)
class EditSerializer(serializers.ModelSerializer):
tag = Tag1Serializer(many=True, read_only=True)
class Meta:
model = Movie
fields = ('title', 'tag', 'info', 'created', 'status')
def update(self, instance, validated_data):
import pdb; pdb.set_trace()
tags_data = validated_data.pop('tag')
for tag_data in tags_data:
tag_qs = Tag.objects.filter(name__iexact=tag_data['name'])
if tag_qs.exists():
tag = tag_qs.first()
else:
tag = Tag.objects.get(**tag_data)
instance.tag.add(tag)
return movie
Views.py
class MovieViewSet(viewsets.ModelViewSet):
queryset = Movie.objects.all()
serializer_class = MovieSerializer
エラー:何もput(self, validated_data)
を呼び出していないので、
Traceback
tags_data = validated_data.pop('tag')
KeyError: 'tag'
djangoはブートストラップのようにPythonをCSSに変換しますか? –
いいえ、djangoは、モデル、URL、テンプレートなどを設定する方法の設定構造を持つPythonのフレームワークです。 – Ycon