2016-09-08 12 views
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": [] }) 

答えて

1

あなたのJSONをする必要があります。

{ 
"title": "TEST_title", 
"tag": [ {"name": "test1" }, 
     {"name": "test2"} 
     ], 
"info": [] 
} 

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') 

    def create(self, validated_data): 
     tags_data = validated_data.pop('tag') 
     movie = Movie.objects.create(**validated_data) 
     for tag_data in tags_data: 
      movie.tag.create(**tag_data) 
     return movie 
+0

これは働いていません。私は500エラー(ここでトレースバック - http://dpaste.com/0BB0ZE8)を取得します。だから私は "tag ="を "read_only = False"に変更しました。これで、もはや500エラーは発生しませんでしたが、ネストされていないデータのみがポストされました。 – Ycon

+0

申し訳ありません私は最初にそれをテストしませんでした。しかし、私は今テストしましたが、 'Tag'シリアライザの' taglevel'フィールドを(私のテストのために)省略しなければなりませんでした。しかし、私もあなたのタグに投稿しているあなたのjsonデータが正しくないことに気付きました。 1.辞書に重複したキーがあります。しかし、これは、作成した映画のタグを作成する方法です。 – JClarke

+0

再度同じ問題が発生します。ネストされていないフィールドにのみデータをポストします。私はこのように投稿しています - r = requests.post( 'http:// localhost:8000/api/Data /'、{"title": "TEST_title"、 "tag":[{"name": "test1" }、{"name": "test2"}]、 "info":[]}) – Ycon

関連する問題