Скопируйте файл из FileField одной модели в FileField другой модели, не читая его.

Допустим, у меня есть примерно такая модель -

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 в качестве хранилища мультимедиа, если это необходимо.

Если есть какое-то решение этой проблемы, я был бы доволен


person yadavankit    schedule 16.05.2019    source источник


Ответы (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)
person Gasanov    schedule 16.05.2019
comment
да, это то, что я уже знаю. Но есть ли способ, при котором мне не нужно читать файл, потому что файл огромен, и я не хочу, чтобы он был в моей памяти. - person yadavankit; 16.05.2019
comment
Вы не сказали, что файл большой или вам не нужен он в памяти. - person Gasanov; 16.05.2019
comment
@yadavankit не совсем уверен, что он будет работать с s3, но на локальном сервере он работает нормально. - person Gasanov; 16.05.2019
comment
вы используете django-storages? - person Gasanov; 16.05.2019
comment
Давайте продолжим это обсуждение в чате. - person yadavankit; 16.05.2019
comment
@yadavankit попробуйте это решение. - person Gasanov; 16.05.2019