【问题标题】:DRF using serializers with a dynamic primary keyDRF 使用带有动态主键的序列化程序
【发布时间】:2018-07-07 01:29:12
【问题描述】:

我们的 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

没有成功。

如何将此主键放入序列化程序?

【问题讨论】:

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


    【解决方案1】:

    我太难了。解决方法很简单。

    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。这为我们解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多