1
ネストされたコンテンツを正常に返すようにシリアライザをセットアップしました。Django Rest Frameworkシリアライザでネストされたフィールドに投稿
ただし、ネストされたフィールド内にデータを投稿できませんでした。
データを投稿するときにエラーは発生しませんが、ネストされていないフィールドにのみ投稿されます。
投稿項目に「名前」フィールドまたは主キー(モデル「TAG」)を使用したいと思います。
Models.py
class Tag(models.Model):
name = models.CharField("Name", max_length=5000, blank=True)
def __str__(self):
return self.name
class Movie(models.Model):
title = models.CharField("Whats happening?", max_length=100, blank=True)
tag = models.ManyToManyField('Tag', blank=True)
def __str__(self):
return self.title
Serializers.py:投稿データの
class TagSerializer(serializers.ModelSerializer):
taglevel = filters.CharFilter(taglevel="taglevel")
class Meta:
model = Tag
fields = ('name', 'taglevel', 'id')
class MovieSerializer(serializers.ModelSerializer):
tag = TagSerializer(many=True, read_only=False)
info = InfoSerializer(many=True, read_only=True)
class Meta:
model = Movie
fields = ('title', 'tag', 'info')
def validate(self, data):
print(self.initial_data.__dict__)
data['tag_name'] = []
if 'tag' in self.initial_data.keys():
for entry in self.initial_data['tag']:
data['tag_name'].append(entry['name'])
return data
def create(self, validated_data):
print(validated_data)
tags_data = validated_data.pop('tag')
movie = Task.objects.create(**validated_data)
for tag_data in tags_data:
Movie.objects.create(name=name, **tag_data)
return movie
サンプル:
r = requests.post('http://localhost:8000/api/Data/',{ "title": "TEST_title", "tag": [ { "name": "test1", "name": "test2" } ], "info": [] })
これは働いていません。私は500エラー(ここでトレースバック - http://dpaste.com/0BB0ZE8)を取得します。だから私は "tag ="を "read_only = False"に変更しました。これで、もはや500エラーは発生しませんでしたが、ネストされていないデータのみがポストされました。 – Ycon
申し訳ありません私は最初にそれをテストしませんでした。しかし、私は今テストしましたが、 'Tag'シリアライザの' taglevel'フィールドを(私のテストのために)省略しなければなりませんでした。しかし、私もあなたのタグに投稿しているあなたのjsonデータが正しくないことに気付きました。 1.辞書に重複したキーがあります。しかし、これは、作成した映画のタグを作成する方法です。 – JClarke
再度同じ問題が発生します。ネストされていないフィールドにのみデータをポストします。私はこのように投稿しています - r = requests.post( 'http:// localhost:8000/api/Data /'、{"title": "TEST_title"、 "tag":[{"name": "test1" }、{"name": "test2"}]、 "info":[]}) – Ycon