在DjangoRestFramework中发布嵌套数据

时间:2016-10-31 14:46:36

标签: python django django-rest-framework

我试图在模型上发布多个到多个字段。

以下代码POSTS(提供200 OK响应),但数据(" text")永远不会发布。

我使用了PDB跟踪,而1 occurs 1 time 3 occurs 4 times 确实包含了正确的数据。

仅供参考我不得不使用info_data数据,因为self.initial正在剥夺PK字段。

Models.py:

validate_data

串行:

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)

Views.py

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

我发布的数据如下所示:

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

我发布了MOVIE模型的PK:

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

1 个答案:

答案 0 :(得分:0)

所以我需要在信息序列化器中导入PK以保存self.initial工作。

我基本上首先必须验证数据,我将其作为infos_data确定。

然后我必须检查Info类的PK,以便我可以更新它。我调用了我的内容(文本)然后保存了它。

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