Скопируйте файл из FileField одной модели в FileField другой модели, не читая его - PullRequest
0 голосов
/ 16 мая 2019

Допустим, у меня есть модель, похожая на эту -

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 Ответ

1 голос
/ 16 мая 2019

Да, вам нужно создать новый файл, а не просто скопировать путь к старому файлу.Поскольку вы используете 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)
...