2016-10-31 17 views
0

モデルの多対多フィールドに投稿しようとしています。DjangoRestFrameworkでネストされたデータを投稿する

以下のコードはPOSTS(200 OK応答を返しますが、データ( "text")は決して投稿されません)。

私はPDBトレースを使用しましたが、info_dataには正しいデータが含まれています。

FY validate_dataがPKフィールドをストライピングしていたため、self.initialというデータを使用しなければなりませんでした。

Models.py:

class Info(models.Model): 
    text = models.CharField("HTML/Text String", max_length=50000, blank=True) 
    file = models.FileField(upload_to='uploads/', blank=True) 

class Movie(models.Model): 
    info = models.ManyToManyField('Info', blank=True) 

シリアライザ:

{"info":[{"text":"Test POST", "pk":2}]} 

class InfoSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Info 
     fields = ('text', 'pk') 

class EditorSerializer(serializers.ModelSerializer): 
    info = InfoSerializer(many=True, read_only=False) 
    class Meta: 
     model = Movie 
     fields = ('info',) 
    def update(self, instance, initial_data): 
     infos_data = self.initial_data.pop('info') 
     for info_data in infos_data: 
      info_qs = Info.objects.filter(pk=info_data['pk']) 
      if info_qs.exists(): 
       info = info_qs.first() 
      else: 
       info = Info.objects.create(**info_data) 
      instance.info.add(info) 
      # import pdb; pdb.set_trace() 
     return instance 

Views.py

class EditorViewSet(viewsets.ModelViewSet): 
    queryset = Task.objects.all() 
    serializer_class = EditorSerializer 

私はこのようなルックスを掲示していたデータ

私はMOVIEモデルのPKを、それを掲示しています:

example.com/api/Editor/123 

答えて

0

だから私は周りself.initial仕事をして保存するには、infoシリアライザにインポートPKを必要としていました。

私は基本的に最初にデータを検証する必要があります。範囲はinfos_dataです。

私は、PKのInfoクラスをチェックして、それを更新する必要がありました。私は自分のコンテンツ(テキスト)を呼び出して保存しました。

class InfoSerializer(serializers.ModelSerializer): 
    pk = serializers.IntegerField(read_only=False, required=False) 
    class Meta: 
     model = Info 
     fields = ('text', 'pk') 

class EditorSerializer(serializers.ModelSerializer): 
    info = InfoSerializer(many=True, read_only=False) 

    class Meta: 
     model = Movie 
     fields = ('info',) 

    def update(self, instance, validated_data): 
     infos_data = validated_data.pop('info') 
     for info_data in infos_data: 
      info = Info.objects.get(pk=info_data['pk']) 
      info.text = info_data['text'] 
      info.save() 
関連する問題