DRF-通过网址更改文件字段

时间:2018-07-12 11:22:20

标签: django django-rest-framework

我是Django Rest Framework的新手。我有一个带文件字段的Django模型。

class MyClass(models.Model):
    name = models.CharField(max_length=200, null=True, blank=True)
    file = models.FileField(blank=False, null=True, use_url=True)

class MyClassSerializer(serializers.ModelSerializer):
    class Meta(object):
        model = MyClass
        exclude = []

class MyClassView(generics.RetrieveUpdateDestroyAPIView):
    queryset = MyClass.objects.all()
    serializer_class = MyClassSerializer

采用两个MyClass实例A和B。从我的前端,我想发送一个PUT请求,以将实例A的文件复制到模型B。

因此,我首先发出GET请求,该请求返回带有文件URL(例如:“ {...,文件:'http://myserver.com/file.pdf”)的实例A)。然后,我发送一个PUT请求以使用该URL更新实例B,但出现以下错误:

The submitted data was not a file. Check the encoding type on the form. 

出于性能原因,我不希望再次下载和上传文件。知道如何序列化字段以使其接受服务器上另一个文件的url吗?

1 个答案:

答案 0 :(得分:1)

您可以在序列化程序中使用URLField,然后在放置请求中可以发送链接。

如果文件托管在您自己的服务器上,并且有可用的pk,则可以改用它。

示例:

class MyClassSerializer(ModelSerializer):
    file_url= URLField(required=True) 

    class Meta:
        model = MyClass
        fields = ('file_url',)

    def update(self, instance, validated_data):
        link = validated_data.get('file_url')
        # and whatever you need to do like download the file or ...

您还可以在验证中处理文件,然后将其传递以进行更新。

类似这样的东西:

def validate_file_url(self, value):
    if value:
        #download the file and return it.
    return value

基本上在任何时候您都需要开箱即用,考虑添加自己的字段并根据需要对其进行验证,然后根据需要使用它。