【问题标题】:DRF - change file field by urlDRF - 通过 url 更改文件字段
【发布时间】:2018-07-12 11:22:19
【问题描述】:

我是 Django Rest 框架的新手。我有一个带有文件字段的 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 的实例 A(例如:`{...,文件:'http://myserver.com/file.pdf'))。然后我发送一个 PUT 请求以使用该 URL 更新实例 B,但我收到以下错误:

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

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

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

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

    如果文件托管在您自己的服务器上并且有可用的 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
    

    基本上任何时候你需要做一些开箱即用的事情,考虑添加你自己的字段并根据需要验证它们并根据需要使用它。

    【讨论】:

    • 谢谢,这回答了我的部分问题。有没有办法更改reference to the file 而无需将文件加载到内存中或下载它?我只有一个默认文件字段(以及文件名/url),所以没有 pk。是否值得为此使用 pk 创建一个单独的文件模型?
    • 如果您的文件由您的服务器托管,那么可以。您可以保存文件路径或在主文件中创建一个 ForeignKey 字段。如果路径对您来说不够好,那么是的,您可以考虑制作一个模型来管理您的文件。如果您在不同的模型中使用文件或保存详细数据(如描述或 ....
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多