我是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吗?
答案 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
基本上在任何时候您都需要开箱即用,考虑添加自己的字段并根据需要对其进行验证,然后根据需要使用它。