将文件从一个模型的FileField复制到另一个模型的FileField而不读取它

时间:2019-05-16 13:03:51

标签: python django amazon-s3 django-models django-file-upload

假设我有一个类似这样的模型-

class Test(models.Model):
    some_file=FileField(upload_to='test_directory')

class TestTransfer(models.Model):
    transferred_file=FileField(upload_to='transfer_directory')

现在,我已经尝试过像这样的简单对象到对象的复制:

transfer_object.transferred_file=test_object.some_file
transfer_object.save()

上面的代码没有做的是,它没有将文件上传到transfer_directory。由于文件很大,所以我不希望它占用内存空间,并且有多个文件需要传输。

如果需要,我正在使用S3作为媒体存储。

如果有解决此问题的方法,我会感到满足

1 个答案:

答案 0 :(得分:1)

是的,您必须创建新文件,而不仅仅是复制旧文件的路径。由于您将S3与django-storages一起使用,因此可以按照以下步骤进行操作:

from django.core.files.base import ContentFile
from django.core.files.storage import default_storage


new_file = ContentFile('')
new_file.name = os.path.basename(test_object.some_file.name)
transfer_object.transferred_file = new_file
transfer_object.save()

bucket = default_storage.bucket
original_file = default_storage.open(test_object.some_file.name)
destination_file = default_storage.open(transfer_object.transferred_file.name)
copy_source = {
    'Bucket': bucket.name,
    'Key': original_file.obj.key
}
bucket.copy(copy_source, destination_file.obj.key)