使用带有动态主键的序列化器的DRF

时间:2018-07-06 15:10:49

标签: python django-rest-framework django-serializer

我们的API定义了一个模型:

class Job(models.Model):
    file = models.FileField('File')
    xml = models.FileField('XML')

有一个基本的序列化器:

class XmlSerializer(serializers.ModelSerializer)
    file = serializers.FileField(read_only=True)
    xml = serializers.FileField(required=True)

    class Meta:
        model = Job
        fields = '__all__'

我们不想更改file,但是我们想更改xml字段。 xml由不知道主键的系统上载。当然,我们需要用它来更新模型。

此刻我有以下代码:

class ProcessXml(mixins.CreateModelMixin, generics.GenericAPIView):
    serializer_class = XmlSerializer

    def post(self, request, format=None):
        pk = 200
        serializer = XmlSerializer(request.data)
        return Response({})

pk = 200作为示例,而不是我们用来解析xml的代码。我知道这行不通,但是(或多或少)表明了我的意图。

我尝试使用

id = serializers.SerializerMethodField()

def get_id(self, obj):
    return 200

没有成功。

如何将主键放入序列化器?

1 个答案:

答案 0 :(得分:0)

我太难了。解决方案非常简单。

class ProcessXml(mixins.CreateModelMixin, generics.GenericAPIView):
    serializer_class = XmlSerializer

    def post(self, request, format=None):
        id = magic_xml_parser_function()

        job = get_object_or_404(Job, pk=id)
        serializer = XmlSerializer(job, data=request.data)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        else:
            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

magic_xml_parser_function()包含我们在xml中找到的ID。这为我们解决了。